c#参数隐式转换

本文关键字:转换 参数 | 更新日期: 2023-09-27 18:05:04

使用以下代码:

    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");
        }    
    }

为什么这段代码打印"I am an int"而不是"I am a long" ?

c#参数隐式转换

为什么这段代码打印&;I am an int&;而不是"我是一个长";

?

因为编译器通过c# 5规范中的重载解析规则,从第7.5.3节开始。

这两个都是适用的函数成员(即它们都对参数列表有效),但Check(int)方法"更好";比Check(long)方法(第7.5.3.2节)要好,因为实参的类型是int,并且单位转换"更好"。

给定将表达式E转换为T1类型的隐式转换C1和将表达式E转换为T2类型的隐式转换C2,如果至少满足下列条件之一,则C1是比C2更好的转换:

  • E具有S类型,并且存在从S到T1的身份转换,但不存在从S到T2的身份转换

这里Eint, T1int, T2long。从intint有身份转换,但不是从intlong…因此,该规则适用,并且从intint的转换比从intlong的转换更好。