根据语言规范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
用作后备来表示一个项目。