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

Wil*_*ler 5 extension-methods .net-4.0 c#-4.0 .net-4.5

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

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

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

Fré*_*idi 3

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

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

public class Foo
{
}

public static class ExtensionMethods
{
    public static void ExtendFoo(this Foo foo, string bar)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,this装饰器是唯一指示编译器将其视为ExtendFoo()增强 class 的扩展方法Foo。换句话说,我们无法摆脱参数foo,它将引用扩展方法将应用到的实例Foo,即相当于this该方法是本机的Foo。问题是,静态类无法实例化,那么我们要传入该参数什么呢?

我们可以解决这个问题,并规定如果Foo是静态的,那么编译器应该发出传递的代码,null而不是Foo(无论如何都不可能存在)的实际实例。但这将是一个明显的拼凑,并且可能不应该仅仅因为这个原因而成为该语言的一部分。期待NullReferenceExceptions其他地方。