解决扩展方法/LINQ歧义我正在为ReSharper4编写一个插件。为此,我需要引用几个ReSharper程序集。其中一个程序集(JetBrains.Platform.ReSharper.Util.dll)包含System.Linq命名空间,其中包含System.Core已提供的扩展方法的子集。当我编辑代码时,它会在这些扩展名之间产生歧义,因此我无法使用OrderBy。我怎么解决这个问题?我想使用核心LINQ扩展,而不是ReSharper的扩展。尝试编译时出现以下错误:以下方法或属性之间的调用不明确:'System.Linq.Enumerable.OrderBy(System.Collections.Generic.IEnumerable,System.Func)'和'System.Linq.Enumerable.OrderBy(System.Collections.Generic.IEnumerable,System.Func)'编辑:我尝试了下面的建议,不幸的是没有运气。同时,我通过删除对System.Core的引用“解决”了这个问题。这样我就可以使用ReSharperDLL文件提供的扩展。我上传了一个示例程序,我刚刚导入了我需要的ReSharperDLL文件。我将System.Core的别名更改为SystemCore,并添加了externalias指令,但它仍然不起作用。如果我错过了什么,请告诉我。PS参考是安装在“C:ProgramFilesJetBrainsReSharperv4.1...”默认目录中的ReSharperv4.1DLL文件。这可能是使用外部别名有意义的少数情况之一。在System.Core参考的属性页中(即在参考下,选择System.Core,右键单击并选择“属性”),将“别名”值更改为“global,SystemCore”(或者如果这是空白的开始)。然后在你的代码中写:externaliasSystemCore;使用SystemCore::System.Linq;这将使System.Core.dll的System.Linq命名空间中的所有相关类型等可用。这里的名称“SystemCore”是任意的——您可以将其称为“DotNet”或其他名称,如果这样对您来说更清楚的话。这并不是真正的答案,但可能会给其他人提供一种更简单的方法来重现问题(从命令行-如果需要,可以在VisualStudio中使用两个项目)。1)创建BadLinq.cs并将其构建为BadLinq.dll:使用System.Collections.Generic;namespaceSystem.Linq{publicstaticclassEnumerable{publicstaticIEnumerableWhere(thisIEnumerablesource,Funcpredicate){returnnull;}}}2)创建Test.cs:externaliasSystemCore;使用系统;使用SystemCore::System.Linq;staticclassTest{staticvoidMain(){varnames=new[]{“Larry”,“Curly”,“Moe”};varresult=names.Where(x=>x.Length>1);}}3)使用指定的外部别名编译Test.cs:cscTest.cs/r:BadLinq.dll/r:SystemCore=System.Core.dll失败:Test.cs(11,28):错误CS1061:“System.Array”不包含“Where”的定义,扩展方法“where”也不接受“System.Array”类型的第一个可以找到参数(是吗?)缺少using指令或程序集引用?)如果您改为尝试不使用扩展方法(即Enumerable.Where),它可以使用外部别名。我认为这可能是一个编译器错误。我已经通过电子邮件发送了C#团队阅读的私人邮件列表-我会在收到回复时更新此答案或添加新的。这不再是问题,因为我能够使用ReSharperDLL文件提供的LINQ扩展,即使是在面向.NET3.0时也是如此。斯基特先生又对了!我可以使用完整的LINQ语法,同时在项目属性中以.NET3.0为目标,而不是引用System.Core!为了使ReSharper与其使用的各种解决方案尽可能兼容,它是针对.NET2.0构建的。LINQ等是在C#3.0中引入的,因此在该版本的框架中不可用。因此,JetBrains添加了自己的版本。解决方案是针对.NET2.0构建插件。我在使用System.ComponentModel时遇到了不明确的引用问题。VisualStudio抱怨在v2和v4中都存在DLL文件。我能够通过删除对系统DLL文件的引用并读取它来解决它。一种解决方案是将所有代码移出到使用ReSharper代码的部分类中。在那里,您只导入ReSharper命名空间而不是System.Core。在分部类的其余部分,导入所需的所有其他命名空间,包括System.Core,但不导入ReSharper命名空间。我遇到了同样的问题,即使使用外部别名,我也将其作为Connect上的编译器错误提出。当前的解决方法是删除扩展方法语法。该错误已在VisualStudio2010中修复。这确实是一个编译器错误。我有同样的问题,我只是通过清理和重建项目解决了它。之后问题就消失了。我有类似的情况。经过两个小时的挣扎,我意识到我的库中有重复的命名空间名称。如果你使用的是微软发布的Dynamic.cs文件,那么你唯一需要做的就是将当前命名空间重命名为其他名称,它就会被修复。//版权所有(C)MicrosoftCorporation。版权所有。使用系统;使用System.Collections.Generic;使用系统文本;使用System.Linq;使用System.Linq.Expressions;使用System.Reflection;发射;使用系统线程;命名空间System.Linq.Dynamic在MVC(.Net4.5、MVC5)中使用PagedList时,我发现了同样的歧义。我发现如果我使用对象作为模糊参数并先显式转换它,问题就解决了。如果歧义是在采用System.Linq.Enumerable的方法和采用System.Collections.Generic.IEnumerable作为参数的方法之间,并且源类型是System.Collections.Generic.IEnumerable,我不知道关于使用扩展方法。我投了赞成票。在此示例中,我的存储库方法返回一个列表:searchRequest.CaseSearchResults=csr.SelectMatchingCases(searchRequest);varresults=searchRequest.CaseSearchResults.AsEnumerable();intpageNum=(int)(ViewBag.PageNum??1);varpageResults=results.ToPagedList(pageNum,5);在searchRequest.CaseSearchResults上调用扩展方法会导致歧义错误;在调用扩展之前显式转换为结果。以上就是《C#学习教程:解决扩展方法/LINQ歧义共享》的全部内容。如果对您有用,您需要进一步了解C#学习教程,希望您多加关注---本文收集自网络,不代表立场。涉及侵权,请点击维权联系管理员删除。如需转载请注明出处:
