拥有此代码:
class Program
{
static void Main(string[] args)
{
Check(3);
Console.ReadLine();
}
static void Check(int i)
{
Console.WriteLine("I am an int");
}
static void Check(long i)
{
Console.WriteLine("I am a long");
}
static void Check(byte i)
{
Console.WriteLine("I am a byte");
}
}
为什么这段代码打印“我是一个int”而不是“我很长”?
答案 0 :(得分:13)
为什么这个代码打印"我是一个int"而不是"我是一个很长的" ?
因为编译器完成了重载决策的规则,这些规则在C#5规范中,从7.5.3节开始。
这两者都是适用的功能成员(即它们都对参数列表有效)但Check(int)
方法更好"而不是Check(long)
方法(第7.5.3.2节),因为参数的类型是int
,身份转换是"更好"而不是扩大转换(第7.5.3.3节)。
给定从表达式E转换为类型T1的隐式转换C1,以及从表达式E转换为类型T2的隐式转换C2,如果至少下列其中一个成立,则C1是比C2更好的转换:
- E具有类型S,并且存在从S到T1而不是从S到T2的身份转换
- ...
此处E
为int
,T1
为int
,T2
为long
。有int
到int
的身份转换,但不是int
到long
...因此适用此规则,以及{{1 } int
优于int
到int
的转换。