我们的商店有一个核心库,提供了一个实际执行Linq First
所做的扩展方法FirstOrDefault
。在我们使用Linq之前,我们的方法一直在使用。 Linq引用稍后添加,这样做不会导致任何问题。使用该核心的应用程序能够继续调用First
并使我们的方法与Linq同名。最近,当我们的Core构建的变化超过一个月的时间时,这种情况发生了变化。现在它将First
解析为Linq的版本,而不是自定义版本。
扩展方法的一点是你没有限定它们。你打电话
PeopleTable.Rows.OfType(Of DataRow)().First
而不是
utlCore.First(PeopleTable.Rows.OfType(Of DataRow)())
因此,重新访问代码以尝试限定命名空间是不切实际的。我知道复制核心以消除冲突并简单地使用FirstOrDefault
是有意义的,但这是一个更大的后来的待办事项。
显然,对于如何解决这些扩展方法存在一些优先级。我不知道会发生什么变化导致这个优先顺序失败。你会从哪里开始寻找?什么可能导致这种情况?
答案 0 :(得分:0)
我猜你通过“ExtensionAttribute
hack”启用了“启用”扩展方法,这就是扩展方法而不是LINQ ...
至于为什么你现在看到这个问题,你可能会在新代码中包含这个问题:
using System.Linq;
由于这会将System.Linq.Enumerable
纳入范围,现在您的First
和Linq First
之间存在歧义 - 您可以使用命名空间别名 sorta 来控制它。这是一个一次性的例子:
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命名空间,并且你会回到同样的境地。