c#参数隐式转换

时间:2015-07-27 20:07:53

标签: c# implicit-conversion

拥有此代码:

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

1 个答案:

答案 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的身份转换
  •   
  • ...
  •   

此处EintT1intT2long。有intint的身份转换,但不是intlong ...因此适用此规则,以及{{1 } int优于intint的转换。