【发布时间】:2011-11-08 20:30:06
【问题描述】:
我已经读到可以在 F# 中扩展静态类,尽管在 C# 中还不可能。提出了多种解决方法,因此表明这种类型的扩展可能相当有用。
虽然扩展方法被定义为静态的,但它们适用于被扩展的类型实例。
因为没有什么让我认为它现在可用,所以我想知道现在是否可以使用 .NET 4.0+ 中的 C# 中的扩展方法语法来扩展静态类?
【问题讨论】:
标签: c#-4.0 .net-4.0 extension-methods .net-4.5
我已经读到可以在 F# 中扩展静态类,尽管在 C# 中还不可能。提出了多种解决方法,因此表明这种类型的扩展可能相当有用。
虽然扩展方法被定义为静态的,但它们适用于被扩展的类型实例。
因为没有什么让我认为它现在可用,所以我想知道现在是否可以使用 .NET 4.0+ 中的 C# 中的扩展方法语法来扩展静态类?
【问题讨论】:
标签: c#-4.0 .net-4.0 extension-methods .net-4.5
在合理的将来,在 C# 中使用扩展方法增强静态类可能是不可能的,除非语言改变了扩展方法的声明方式。
想象一下,我们必须将此功能添加到语言中。扩展方法目前被定义为静态方法,带有一个用 this 关键字修饰的附加参数:
public class Foo
{
}
public static class ExtensionMethods
{
public static void ExtendFoo(this Foo foo, string bar)
{
}
}
在上面的代码中,this 装饰器是唯一指示编译器将ExtendFoo() 视为扩展类Foo 的扩展方法。换句话说,我们不能去掉参数foo,它将引用扩展方法将应用到的Foo的实例,即如果方法是,则相当于this原生于Foo。问题是,静态类不能被实例化,那我们要传入那个参数什么呢?
我们可以解决这个问题,并规定如果Foo 是静态的,那么编译器应该发出传递null 的代码,而不是Foo 的实际实例(无论如何都不存在)。但这将是一个明显的组合,并且可能不应该仅仅因为这个原因而成为语言的一部分。否则,请期待NullReferenceExceptions。
【讨论】: