我在MS documentation个线程中发现了矛盾,它说你可以扩展它,但在很多Stack Overflow个线程中,我发现你不能扩展它,因为它是静态类.VS社区也不允许我编译我的代码,因为文件是静态类型,不能用作参数.

请从文档中向我解释这一部分:

其他示例可能是将通用功能添加到System.String类,扩展System.IO.File和System.IO.Stream对象的数据处理功能,以及针对特定错误处理功能扩展System.Exception对象.这些类型的用例仅受您的想象力和良好判断力的限制.

我的测试代码:

  • MyExtension类:
public static string ExtendFileClass(this File value)
{
    return value.ToString();
}

推荐答案

您不能像为ExtendFileClass编写扩展方法那样为System.IO.File编写扩展方法.从[引用静态类类型]:1中指定,当您想要访问静态类的嵌套类时,或者在成员访问表达式中,只允许在typeof表达式中引用静态类.在其他任何地方使用静态类都是无效的,例如用作参数类型.

即使您可以声明这样一个方法,您也不能以任何有意义的方式调用这个扩展方法,因为您不能创建File的实例(这是因为File是一个静态类,正如链接的帖子所指出的那样).可以传递给扩展方法的最大值是null,这不是很有帮助.

我怀疑这可能是文档中的错误.作为参考,文档的这一特定部分被添加了this pull request.似乎这里的File个例子也被 comments 者遗漏了.我怀疑作者可能指的是System.IO.FileInfo,其中is是一个您可以创建其实例的类.

附注:"扩展"在这里指的是编写扩展方法,不要与inheritance上下文中的关键字extends混淆.

Csharp相关问答推荐

Autofac:如何防止丢弃通过ServicCollection注册的服务?

System.Data.SQLite:判断SQLite数据库是否为空(任何表中至少有一行)

如何在C#中删除一个特殊字符,如"使用Regex"

. NET在上一个操作完成之前,在此上下文实例上启动了第二个操作

如何使用新的Microsoft.IdentityModel.JsonWebToken创建JwtSecurityToken?

无法通过绑定禁用条目

使用HttpResponseMessage中的嵌套列表初始化JSON

UWP中的任务和界面

如何从ASP.NET核心MVC视图和Blazor传递数据

SortedSet.Remove()不会删除SortedSet.Min返回的元素

异步任务导致内存泄漏

使用Entity Framework6在对象中填充列表会导致列表大多为空

当我没有此令牌时,为什么语法报告EOF错误?

在.NET 8最低API中从表单绑定中排除属性

C#自定义验证属性未触发IsValid方法

C#按名称从类获取属性值类型<;t>;,我需要反射吗?

如何在C# WinForm控件中使用Windows 10/11的黑暗主题?

使用C#12中的主构造函数进行空判断

使用C#代码和SQL SERVER中的相同证书签名会产生不同的结果

如何在.NET8中使用Blazor Web App(WebAssembly)托管服务器端控制器?