解决扩展方法/ LINQ歧义

Iga*_*nik 28 .net c# linq extension-methods visual-studio-2008

我正在为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.CoreSystemCore,增加了extern alias指令,但它仍然没有奏效.如果我错过了什么,请告诉我.PS参考是安装在默认directroy中的ReSharper v4.1 DLL文件"C:\Program Files\JetBrains\ReSharper\v4.1\...".

Jon*_*eet 42

这可能是使用外部别名有意义的罕见情况之一.

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

然后在你的代码中写下:

extern alias SystemCore;
using SystemCore::System.Linq;
Run Code Online (Sandbox Code Playgroud)

这将使System.Core.dll的System.Linq命名空间中的所有相关类型等可用.这里的名称"SystemCore"是任意的 - 您可以将其称为"DotNet"或其他东西,如果这样可以让您更清楚.


Jon*_*eet 6

这不是一个真正的答案,但可以为其他人提供一种更简单的方法来重现问题(从命令行 - 如果需要,可以在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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

3)编译指定extern别名的Test.cs:

csc Test.cs /r:BadLinq.dll /r:SystemCore=System.Core.dll
Run Code Online (Sandbox Code Playgroud)

这失败了:

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

如果你改为不尝试使用扩展方法(即Enumerable.Where),它可以使用extern别名.

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


Iga*_*nik 2

这不再是问题,因为即使针对 .NET 3.0,我也能够使用 ReSharper DLL 文件提供的 LINQ 扩展。

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