当前位置: 首页 > 编程语言 > C#

泛型的扩展方法分享

时间:2023-04-11 11:44:27 C#

泛型的扩展方法我在看这个问题,很好奇为什么这个编译不通过。鉴于此代码,任何人都可以解释为什么对IBase.Test()的调用未解析为正确的扩展方法吗?公共接口IBase{}公共接口IChildA:IBase{}公共接口IChildB:IBase{}publicstaticclassBaseExtensions{publicstaticIBaseTest(thisIBaseself){returnself;}publicstaticTTest(thisTself)whereT:IChildB{returnself;}}publicstaticclassTestClass{publicstaticvoidTest(){IChildAa=null;//是的,我知道它是空的,但只是在这里测试编译..IBasefirstTry=a.Test();//无法解析为BaseExtensions.Test(thisIBaseobj)IBasesecondTry=((IBase)a).Test();//解析为BaseExtensions.Test(thisIBaseobj)IChildBb=null;IChildBtouchedB=b.Test();我得到的错误是Error166Thetype'IChildA'cannotbeusedastypeparameter'T'inthegenerictypeormethod'BaseExtensions.Test(T)'。没有从“IChildA”到“IChildB”的隐式引用转换。我有一种感觉,对于任何实现IChildB并且不知道使用哪种扩展方法的东西来说,它都是模棱两可的,但是错误消息不会出现在它的那一边IBasefirstTry=a.Tes吨();,如果您删除IBasefirstTry=a.Test();然后它编译正常..好的,问题是在重载决议期间,编译器会查找所有适用的候选方法,而不检查方法中指定的通用约束,选择最具体的约束,然后检查通用约束。在这种情况下,泛型方法比非泛型方法更具体(因为在类型参数替换之后,它实际上是一个参数方法)——但它随后因约束而失败。我有一篇博文更详细地解释了这一点,还有一篇以可怕的方式使用它。以上就是C#学习教程:泛型的扩展方法分享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: