在.NET 4.0+中是否可以使用扩展方法扩展静态类?

时间:2011-11-08 20:30:06

标签: c#-4.0 .net-4.0 extension-methods .net-4.5

我已经读过可以在F#中扩展静态类,尽管在C#中它是不可能的。提出了多种解决方法,因此建议这种类型的扩展可能相当有用。

虽然扩展方法被定义为静态,但它们适用于正在扩展的类型实例。

因为没有什么可以让我认为它现在可用,我想知道这个功能现在是否可以在.NET 4.0 +中使用C#中的扩展方法语法来扩展静态类?

1 个答案:

答案 0 :(得分:3)

在合理的将来,C#中可能无法使用扩展方法扩充静态类,除非语言改变了声明扩展方法的方式。

想象一下,我们必须将此功能添加到该语言中。扩展方法目前定义为静态方法,使用this关键字修饰的附加参数:

public class Foo
{
}

public static class ExtensionMethods
{
    public static void ExtendFoo(this Foo foo, string bar)
    {
    }
}

在上面的代码中,this装饰器是唯一指示编译器将ExtendFoo()视为扩充类Foo的扩展方法的东西。换句话说,我们无法摆脱参数foo,它将引用扩展方法将应用的{em>实例Foo ,即等效于{{1如果该方法是this的原生方法。问题是,静态类无法实例化,那么我们将在该参数中传递什么?

我们可以解决问题,并确定如果Foo是静态的,那么编译器应该发出通过Foo而不是null的实际实例的代码(无论如何都不能存在) )。但这将是一个显而易见的问题,并且可能不应仅仅因为这个原因而成为语言的一部分。否则就会到达Foo