3

根据语言规范http://msdn.microsoft.com/en-us/library/bb383977.aspx

您可以使用扩展方法来扩展类或接口,但不能覆盖它们。永远不会调用与接口或类方法具有相同名称和签名的扩展方法。在编译时,扩展方法的优先级总是低于类型本身定义的实例方法。

我不明白为什么会有这个限制?允许覆盖扩展会有什么编程问题?

一个简单的案例研究

基类Object有一个方法 ToString(),默认情况下将对象类型名称返回为字符串。可以说,出于所有意图和目的,它被设计为被覆盖。

默认情况下 aStream不提供覆盖,ToString因为它不知道将字节转换为字符串是否有意义。

但是,作为解决方案的程序员,我知道所有流如果转换为字符串都是有意义的。但是,我不想或不能从流类派生。所以,我想扩展ToString将流转换为字符串的方法;像这样:

public static String ToString(this Stream stream)
{
    var memory = new MemoryStream(); //closable
    var reader = new StreamReader(memory);
    stream.Position = 0;
    stream.CopyTo(memory);
    memory.Position = 0;
    return reader.ReadToEnd();
}

但是,根据规范,它永远不会在运行时被调用。但是为什么在这种情况下对限制如此严格呢?作为Stream派生自Object,这不应该意味着任何专门针对Stream的扩展方法都应该默认覆盖基类型方法吗?

此外,在某些情况下,简单地命名它AsString是没有用的;即 WPFToString用作后备来表示一个项目。

4

1 回答 1

4

扩展方法在扩展对象的继承层次之外。

语言(和 IDE)只是让这个完全独立的类看起来像是扩展类型的一部分。

为了允许覆盖,整个继承模型和扩展机制都需要改变——这是一个非常大的改变,可能是一个破坏性的改变。

In short - this is a feature whose implementation costs would outweigh its usefulness.

于 2013-03-06T12:37:20.747 回答