我们只是在我们的代码中找到了这些:
public static class ObjectContextExtensions
{
public static T Find<T>(this ObjectSet<T> set, int id, params Expression<Func<T, object>>[] includes) where T : class
{
...
}
public static T Find<T>(this ObjectSet<T> set, int id, params string[] includes) where T : class
{
...
}
}
如您所见,除了以外,它们具有相同的签名params
。
而且它们以多种方式被使用,其中一种:
DBContext.Users.Find(userid.Value); //userid being an int? (Nullable<int>)
这对我来说很奇怪,解决了第一个超载。
Q1:为什么这不会产生编译错误?
Q2:为什么C#编译器将上面的调用解析为第一个方法?
编辑:只是为了澄清,这是C#4.0,.Net 4.0,Visual Studio 2010。
这显然是过载解析中的错误。
它在C#5和C#3中复制,但在Roslyn中不复制;我不记得我们是否决定故意进行重大更改,或者这是否是意外事故。(我的机器上现在没有C#4,但是如果它在3和5中再现,那么几乎也肯定会在4中出现。)
我已经引起罗斯林团队前同事的注意。如果他们有任何有趣的回信给我,我会更新此答案。
由于我不再有权访问C#3/4/5源代码,因此我无法说出该错误的原因。考虑在connect.microsoft.com上报告它。
这是一个大大简化的复制:
class P
{
static void M(params System.Collections.Generic.List<string>[] p) {}
static void M(params int[] p) {}
static void Main()
{
M();
}
}
它似乎与元素类型的通用性有关。奇怪的是,正如克里斯在回答中所指出的那样,编译器选择了更通用的代码!我本来希望该错误是另一种方法,然后选择不太通用的方法。
顺便说一句,该错误很可能是我的错,因为我在C#3中做了很多有关重载解析算法的工作。
我在罗斯林(Roslyn)团队中的间谍告诉我,这是一个长期存在的过载解析错误。有一条决胜负规则被实施,从未被记录或证明是合理的,它说具有更大通用泛型的类型是更好的类型。这是一个没有道理的怪异规则,但从未将其从产品中删除。Roslyn团队在一段时间前决定采取重大更改并解决过载解决方案,以便在这种情况下产生错误。(我不记得那个决定,但是我们就这种事情做出了很多决定!)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句