2

我们的商店有一个核心库,它提供了一个扩展方法First,它实际上做了 Linq 所做的事情FirstOrDefault。在我们使用 Linq 之前,我们的方法就已经在使用了。Linq 引用是后来添加的,这样做不会导致任何问题。使用核心的应用程序能够继续调用First并获取我们的方法,而不是同名的 Linq 方法。最近这种情况发生了变化,因为我们的 Core 的构建时间超过了一个月的时间。现在它解析First为 Linq 的版本而不是自定义版本。

扩展方法的要点是您不限定它们。你打电话

PeopleTable.Rows.OfType(Of DataRow)().First

代替

utlCore.First(PeopleTable.Rows.OfType(Of DataRow)())

因此,重新访问代码以尝试限定命名空间是不切实际的。我知道复古核心以消除冲突并简单地使用是有意义的FirstOrDefault,但这是一个更大且后来的任务。

显然,如何解决这些扩展方法有一些优先级。我不知道会发生什么变化导致这种优先级失控。你会从哪里开始寻找?什么可能导致这种情况?

4

1 回答 1

0

我猜你是通过“ ExtensionAttributehack”“启用”扩展方法的,这就是你拥有扩展方法而不是 LINQ 的方式......

至于为什么你现在看到这个问题,你可能已经在新代码的某个地方包含了这个:

using System.Linq;

由于这涉及System.Linq.Enumerable范围,现在您在您的First和 Linq之间有歧义First- 您可以使用命名空间别名来控制它......这是一个一次性的例子:

using System;
using System.Collections.Generic;
// don't add this, lest you bring it in
//using System.Linq;
using Linq = System.Linq.Enumerable;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var values = new List<int>(Linq.Range(0, 10));
            var useLinqFirst = Linq.First(values);
            Console.WriteLine("LINQ First(): {0}", useLinqFirst);
            var useMyFirst = values.First();
            Console.WriteLine("My First(): {0}", useMyFirst);
            Console.ReadLine();
        }
    }

    public static class Ext
    {
        public static T First<T>(this IEnumerable<T> src)
        {
            Console.WriteLine("Using my First!");
            var e = src.GetEnumerator();
            while (e.MoveNext())
            {
                return e.Current;
            }
            return default(T);
        }
    }
}

老实说,我只是改装使用 LINQ 的First\ FirstOrDefault- 从长远来看更安全,因为在某个地方,有人会忘记他们不能包含 Linq 命名空间,你会回到同样的情况。

于 2013-06-28T17:10:41.817 回答