【问题标题】:Has extending static classes using extension methods been made possible in .NET 4.0+?在 .NET 4.0+ 中是否可以使用扩展方法扩展静态类?
【发布时间】:2011-11-08 20:30:06
【问题描述】:

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

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

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

【问题讨论】:

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


【解决方案1】:

在合理的将来,在 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

【讨论】:

  • +1 这确实是一个很好的解释。除此之外,我想不出一种特定的方法来实现它,尽管可能有也可能没有实现这种功能的方法。也许只需在“this”之前或在类型本身之前放置一个“static”关键字就足够了,尽管我不能说它可能必须以这种方式产生的影响。谢谢你的时间! =)
猜你喜欢
  • 2012-11-22
  • 2011-05-12
  • 1970-01-01
  • 1970-01-01
  • 2016-03-11
  • 1970-01-01
  • 1970-01-01
  • 2016-07-01
  • 1970-01-01
相关资源
最近更新 更多