【发布时间】:2014-01-07 16:36:41
【问题描述】:
我们刚刚在我们的代码中找到了这些:
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。
【问题讨论】:
-
Eric Lippert 的这篇文章最近讨论了如何解决重载问题:ericlippert.com/2013/12/23/closer-is-better
-
@Chris 很公平,它可能不直接适用。但鉴于
params可以从调用参数中完全省略(参见此处:msdn.microsoft.com/en-us/library/w5zay9db.aspx),那么我更接近于“定义的第一个”。 -
@CharlieKilian 这篇博文中没有关于声明顺序的内容。
-
有趣的事实:即使这有效,Resharper 7.1 仍将其视为错误。
-
似乎它认为通用对象在参数中“更接近”。如果两者都是通用的或两者都是非通用的,那么它会抱怨歧义。我不能告诉你为什么会这样,但我怀疑规范中的某处某处说这是它的方式。
标签: c# overloading params roslyn