所以例如你有一个类似的类型:
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)
会调用哪个构造函数,为什么?
我可以自己测试一下,但我想了解重载分辨率系统是如何工作的(不确定它是否被称为).
为什么两个重载都匹配时调用泛型方法?
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)
这里不应该有任何冲突,对吧?
使用Casting null并不能作为灵感编译,并且来自Eric Lippert的评论:
这表明了一个有趣的案例."uint x =(int)0;" 即使int不能隐式转换为uint也会成功.
我们知道这不起作用,因为object无法分配到string:
string x = (object)null;
Run Code Online (Sandbox Code Playgroud)
但这确实如此,但直觉上它不应该:
uint x = (int)0;
Run Code Online (Sandbox Code Playgroud)
为什么不编译器允许这种情况下,int不隐式转换为uint?
.net c# compiler-construction type-conversion implicit-conversion
出于好奇,为什么Log(null)在这种情况下不是一个模棱两可的电话?
class Program
{
static void Main(string[] args)
{
Log(null); // Output is "String"
}
static void Log(object value)
{
Console.WriteLine("Object");
}
static void Log(string value)
{
Console.WriteLine("String");
}
}
Run Code Online (Sandbox Code Playgroud)
由于这两个Log(object)和Log(string)接受null作为参数我期待编译器给我一个模棱两可的调用错误,而是它选择调用Log(string).为什么不Log(object)呢?