所以例如你有一个类似的类型:
public class EffectOptions
{
public EffectOptions ( params object [ ] options ) {}
public EffectOptions ( IEnumerable<object> options ) {}
public EffectOptions ( string name ) {}
public EffectOptions ( object owner ) {}
public EffectOptions ( int count ) {}
public EffectOptions ( Point point ) {}
}
Run Code Online (Sandbox Code Playgroud)
这里我只使用构造函数给出示例,但如果它们是类型本身的非构造方法,结果将是相同的,对吧?
所以当你这样做时:
EffectOptions options = new EffectOptions (null);
Run Code Online (Sandbox Code Playgroud)
会调用哪个构造函数,为什么?
我可以自己测试一下,但我想了解重载分辨率系统是如何工作的(不确定它是否被称为).
我们最近从公司的VS2013搬到了VS2017.升级后,我们的代码库将不再构建.我们会收到以下错误:
以下方法或属性之间的调用不明确:'IRepository <T> .Get(object,params Expression <Func <T,object >> [])'和'IRepository <T> .Get(object,params string [] )"
这是呼叫本身:
this.mainRepository.Get(newEntity.Id);
Run Code Online (Sandbox Code Playgroud)
...和接口定义:
public interface IRepository<T> where T : class
{
T Get(object id, params Expression<Func<T, object>>[] includeExprs);
T Get(object id, params string[] includeExprs);
}
Run Code Online (Sandbox Code Playgroud)
我想知道这里是否有人可以解释为什么会这样.我怀疑C#6.0 的新改进方法重载解析功能,但查看语言规范我无法找出导致该问题的确切规则.
编辑
我写了一篇关于这个问题的后续博客文章:http://codewithstyle.info/method-overload-resolution-in-c-6-0-an-interesting-bug-story
为什么两个重载都匹配时调用泛型方法?
public static void method1(object obj)
{
Console.WriteLine("Object");
}
public static void method1<T>(T t)
{
Console.WriteLine("Type T");
}
public static void Main(String args[])
{
method1("xyz"); //Will print "Type T";
}
Run Code Online (Sandbox Code Playgroud)
这里不应该有任何冲突,对吧?