首页 / C# / 在C#中允许覆盖扩展会出现什么问题
在C#中允许覆盖扩展会出现什么问题
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了在C#中允许覆盖扩展会出现什么问题,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1514字,纯文字阅读大概需要3分钟。
内容图文
根据语言规范http://msdn.microsoft.com/en-us/library/bb383977.aspx
You can use extension methods to extend a class or interface, but not
to override them. An extension method with the same name and signature
as an interface or class method will never be called. At compile time,
extension methods always have lower priority than instance methods
defined in the type itself.
我不明白的是为什么会有这个限制?允许覆盖扩展会有什么编程问题?
一个简单的案例研究
基类Object具有方法ToString(),该方法默认将对象类型名称返回为字符串.可以争辩说,出于所有意图和目的,它旨在被覆盖.
默认情况下,Stream不提供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不会有用.即WPF,它使用ToString作为后备来表示项目.
解决方法:
扩展方法在扩展对象的继承层次结构之外.
语言(和IDE)使该完全独立的类看起来像是扩展类型的一部分.
为了进行覆盖,需要更改整个继承模型和扩展机制-这是非常大的更改,可能是一个重大突破.
简而言之-这是一项功能,其实现成本将超过其用途.
内容总结
以上是互联网集市为您收集整理的在C#中允许覆盖扩展会出现什么问题全部内容,希望文章能够帮你解决在C#中允许覆盖扩展会出现什么问题所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。