29

我正在为ReSharper 4 编写一个加载项。为此,我需要引用几个 ReSharper 的程序集。其中一个程序集 (JetBrains.Platform.ReSharper.Util.dll) 包含一个System.Linq命名空间,其中包含 System.Core 已提供的扩展方法子集。

例如,当我编辑代码时,它会在这些扩展之间产生歧义,因此我无法使用OrderBy. 我怎么能解决这个问题?我想使用核心LINQ扩展,而不是来自 ReSharper 的扩展。

尝试编译时出现以下错误:

以下方法或属性之间的调用不明确:' System.Linq.Enumerable.OrderBy<string,int>(System.Collections.Generic.IEnumerable<string>, System.Func<string,int>)' and 'System.Linq.Enumerable.OrderBy<string,int>(System.Collections.Generic.IEnumerable<string>, System.Func<string,int>)'

编辑:我尝试了下面的建议,不幸的是没有运气。同时,我通过删除对System.Core. 这样我就可以使用 ReSharper DLL 文件提供的扩展。

上传了一个示例程序,我刚刚导入了我需要的 ReSharper DLL 文件。我更改了System.Coreto的别名SystemCore,添加了extern alias指令,但它仍然不起作用。如果我错过了什么,请告诉我。PS 引用的是安装在默认目录中的 ReSharper v4.1 DLL 文件"C:\Program Files\JetBrains\ReSharper\v4.1\..."

4

10 回答 10

43

这可能是使用extern alias有意义的少数情况之一。

在对 System.Core 的引用的属性页面中(即在 References 下,选择 System.Core,右键单击并选择“Properties”),将“Aliases”值更改为“global,SystemCore”(或者如果只是“SystemCore”一开始是空白的)。

然后在你的代码中,写:

extern alias SystemCore;
using SystemCore::System.Linq;

这将使 System.Core.dll 的 System.Linq 命名空间中的所有相关类型等可用。此处的“SystemCore”名称是任意的——您可以将其称为“DotNet”或其他名称,如果这样会让您更清楚的话。

于 2009-01-17T15:42:21.457 回答
7

这并不是真正的答案,但可能会为其他人提供一种更简单的方法来重现该问题(从命令行 - 如果需要,您可以使用 Visual Studio 中的两个项目来完成)。

1) 创建 BadLinq.cs 并将其构建为 BadLinq.dll:

using System.Collections.Generic;

namespace System.Linq
{
    public static class Enumerable
    {
        public static IEnumerable<T> Where<T>(this IEnumerable<T> source, 
                                              Func<T,bool> predicate)
        {
            return null;
        }
    }
}

2)创建Test.cs:

extern alias SystemCore;

using System;
using SystemCore::System.Linq;

static class Test
{
    static void Main()
    {
        var names = new[] { "Larry", "Curly", "Moe" };

        var result = names.Where(x => x.Length > 1);
    }
}

3) 编译 Test.cs 指定外部别名:

csc Test.cs /r:BadLinq.dll /r:SystemCore=System.Core.dll

这失败了:

Test.cs(11,28):错误 CS1061:“System.Array”不包含“Where”的定义,并且找不到接受“System.Array”类型的第一个参数的扩展方法“Where”(你是缺少 using 指令或程序集引用?)

如果您将其更改为不尝试使用扩展方法(即 Enumerable.Where),则它可以与 extern 别名一起正常工作。

我认为这可能是一个编译器错误。我已经通过电子邮件发送了一个 C# 团队阅读的私人邮件列表 - 当我收到回复时,我会更新这个答案或添加一个新答案。

于 2009-01-17T19:47:55.827 回答
2

这不再是一个问题,因为我可以使用 ReSharper DLL 文件提供的 LINQ 扩展,即使是针对 .NET 3.0 也是如此。

斯基特先生又说对了!我能够使用完整的 LINQ 语法,同时在项目的属性中定位 .NET 3.0 而不是引用 System.Core!

于 2009-01-18T08:09:10.450 回答
2

为了使 ReSharper 尽可能与它所使用的各种解决方案兼容,它是针对 .NET 2.0 构建的。LINQ 等出现在 C# 3.0 中,因此它们在该版本的框架中不可用。因此,JetBrains 添加了自己的版本。

解决方案也是针对 .NET 2.0 构建您的插件。

于 2011-04-14T11:37:44.900 回答
1

我在使用 System.ComponentModel 时遇到了模棱两可的参考问题。Visual Studio 抱怨在 v2 和 v4 中都存在 DLL 文件。我能够通过删除对系统 DLL 文件的引用并读取它来解决它。

于 2013-08-29T16:20:35.300 回答
0

一种解决方案是将所有代码移到使用 ReSharper 代码的部分类中。在那里,您将只导入 ReSharper 命名空间,而不是 System.Core。

在部分类的其余部分中,您将导入所需的所有其他命名空间,包括 System.Core,但不导入 ReSharper 命名空间。

于 2009-01-17T21:33:04.400 回答
0

即使使用外部别名,我也遇到了同样的问题,我将其作为Connect 上的编译器错误提出。暂时的解决方法是放弃扩展方法语法。

该错误已针对 Visual Studio 2010 修复。

于 2010-01-28T22:20:03.130 回答
0

这确实是一个编译器错误。

我有同样的问题,我只是通过清理和重建项目来解决它。之后问题就消失了。

于 2010-11-05T11:56:12.817 回答
0

我也有类似的情况。经过两个小时的努力,我意识到我的库中有重复的命名空间名称。如果您使用的是 Microsoft 发布的文件 Dynamic.cs,您唯一需要做的就是将当前命名空间重命名为其他名称,它将被修复。

//Copyright (C) Microsoft Corporation.  All rights reserved.

using System;
using System.Collections.Generic;
using System.Text;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Reflection.Emit;
using System.Threading;

namespace System.Linq.Dynamic    <- for example to Linq.Dynamic
{
于 2014-09-17T07:59:01.300 回答
0

在 MVC(.Net 4.5,MVC 5)中使用 PagedList 时,我发现了同样的歧义。我发现,如果我将对象作为不明确的论点并首先明确地转换它,那么问题就解决了。如果歧义是在采用 System.Linq.Enumerable 的方法和采用 System.Collections.Generic.IEnumerable 作为相关参数的方法之间,并且源是 System.Collections.Generic.IEnumerable 类型,我不使用扩展方法就可以了。我投了它。在这个例子中,我的存储库方法返回一个列表:

searchRequest.CaseSearchResults = csr.SelectMatchingCases(searchRequest);
var results = searchRequest.CaseSearchResults.AsEnumerable<CaseSearchResult>();
int pageNum = (int)(ViewBag.PageNum ?? 1);
var pageResults =results.ToPagedList<CaseSearchResult>(pageNum, 5);

在searchRequest.CaseSearchResults上调用扩展方法导致歧义错误;显式转换为结果,然后调用该扩展名。

于 2015-08-13T20:20:40.477 回答