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

GenericExtensionMethodParseFailed分享

时间:2023-04-10 22:18:39 C#

GenericExtensionMethodParseFailed单个T的泛型约束失效。编译器无法识别可以使用的其他方法。如果我删除单T方法,编译器将正确地找到许多对象的方法。我已经阅读了两篇关于泛型方法解析的博客文章,一篇来自JonSkeet,另一篇来自EricLippert,但我找不到对我的问题的解释或解决方案。显然,使用两种不同名称的方法是可行的,但我喜欢这样的事实,即在这些情况下你只有一种方法。命名空间测试{使用System.Collections.Generic;publicinterfaceSomeInterface{}publicclassSomeImplementation:SomeInterface{}publicstaticclassExtensionMethods{//注释掉这一行,让编译器在publicstaticvoidMethod(thisTparameter)where下面抛出错误的行中选择正确的方法T:SomeInterface{}publicstaticvoidMethod(thisIEnumerableparameter)whereT:SomeInterface{}}classProgram{staticvoidMain(){varinstance=newSomeImplementation();变种实例=新列表();//有效instance.Method();//错误1??类型'System.Collections.Generic.List'//不能用作泛型类型或方法中的类型参数'T'//'Test.ExtensionMethods.Method(T)'。没有从“System.Collections.Generic.List”到“Test.SomeInterface”的隐式引用转换。实例.方法();//有效(实例为IEnumerable).Method();}}}方法比例表示越接近越好。更近是什么意思编译器将查看是否可以找到完全匹配,如果由于某种原因不能找到下一个可能的兼容方法,依此类推。让我们首先通过删除SomeInterface约束来编译该方法。publicstaticclassExtensionMethods{publicstaticvoidMethod(thisTparameter)//whereT:SomeInterface{}publicstaticvoidMethod(thisIEnumerableparameter)//whereT:SomeInterface{}}现在编译器愉快地编译,并注意到两个方法调用转到Method(T)而不是Method(IEnumerable)。这是为什么?因为Method(T)在某种意义上更接近它可以将任何类型作为参数并且不需要任何转换。为什么Method(IEnumerable)没有关闭?这是因为您将变量的编译时类型设置为List,因此需要从List到IEnumerable的引用转换。哪个更接近,但根本不进行任何转换。回到你的问题。为什么是instances.Method();不编译?同样,如前所述,使用Method(IEnumerable)我们需要一些参考转换,所以显然不是更接近。现在我们只剩下一种方法,它非常接近于Method。但问题是你用SomeInterface限制了它,显式List()不能转换成SomeInterface。问题是(猜测)在编译器选择更接近的重载之后检查通用约束。在这种情况下,这将使所选的最佳过载无效。您可以通过将变量的静态类型更改为有效的IEnumerable来轻松修复它,现在您知道为什么了。IEnumerable实例=newList();您是否尝试过在没有泛型的情况下实现第一个,因为它的行为应该相同:方法();但是在这里你需要为每次调用添加......虽然我知道你不想要它,但我认为你应该重新考虑方法名称应该是相同的。我看不出同一个名称如何适用于一个实例以及这些实例的集合。例如,如果您的方法名称是ShootforT,那么另一个方法应该听起来像ShootThemAll或类似的东西。否则你应该让你的分配略有不同:IEnumerableinstances=newList();实例.方法();//现在这应该可以作为最后一个选项,正如Dimitry在评论中所说,您必须明确指定类型参数。以上就是C#学习教程:通用扩展方法分析失败分享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注——instances.Method();如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: