C#学习教程:隐式运算符,泛型不适用于接口类MyClass{publicMyClass(Tval){值=val;}公共T值{得到;放;}publicstaticimplicitoperatorMyClass(TsomeValue){returnnewMyClass(someValue);}publicstaticimplicitoperatorT(MyClassmyClassInstance){returnmyClassInstance.Value;可以做MyClassfoo1=newFoo();MyClassfoo2=newFoo();//但不是MyClassfoo3=(IFoo)newFoo();当尝试做类似的事情时,真正的问题出现在voidBar(IFoofoo){Bar2(foo);//什么应该与Bar2(newMyClass(foo));相同}voidBar2(MyClassmyClass){//Dostuff}如何重构MyClass,以便在仅知道接口时可以使用该对象?简短回答:用户定义的隐式转换不适用于接口。不要试图让它发挥作用。找到了类型系统问题的另一种解决方案。长答案:这是C#设计团队深思熟虑的决定。原理是当你做一个涉及接口的转换时,你想保留引用标识;您是在询问实现该接口的对象的身份,而不是试图创建具有相似属性的相似对象。这里更大的原则是用户定义的转换不应该取代内置的转换。但是由于几乎任何类都可以被子类化,并且该子类几乎可以实现任何接口,因此很难静态地知道涉及接口的给定用户定义转换是否可能会替换内置转换。仅供参考,这是规范中特别棘手的一点,C#编译器在这里有一些错误。我怀疑您上面的一个案例利用了这些漏洞;现实世界中有一些程序可以执行此操作,这一事实使我无法修复该错误。这些错误主要是由于在仿制药之前设计此功能,然后在仿制药引入了许多无法预料的复杂情况后没有充分重新设计的结果。有关详细信息,请参阅此处的大量评论,尤其是标记为DELIBERATESPECVIOLATION的位,它描述了接口转换的问题。https://github.com/dotnet/roslyn/blob/master/src/Compilers/CSharp/Portable/Binder/Semantics/Conversions/UserDefinedImplicitConversions.cs如你所见,这个文件不到一千行,可能更多超过一半的笔记。经过数周的仔细研究以及与语言团队的多次讨论,才解决了这些语义问题。一旦你在编译器上犯了一个错误,你通常要在十年后彻底了解它,然后永远不要让客户在升级时破坏它。语言设计者有许多关于C#如何搞砸规范中这个晦涩部分的对象类。我如何重构MyClass以便在仅知道接口时可以使用该对象?不要尝试。将接口引用转换为实际的运行时类型并从那里使用它。或者显式创建所需类型的实例,而不是通过隐式转换。不要尝试玩带有隐式转换和接口的游戏;这不会很好。以上就是C#学习教程:隐式运算符、泛型并不适用于接口分享的所有内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处:
