c#参数隐式转换

有这个代码:

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”而不是“我很长”?

为什么这段代码打印“我是一个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的标识转换

这里EintT1intT2long 。 有从intint的标识转换,但不是从intlong …因此适用此规则,并且从intint的转换优于从intlong的转换。