【问题标题】:c# parameter implicit conversionc#参数隐式转换
【发布时间】:2015-07-27 20:07:53
【问题描述】:

拥有此代码:

    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# implicit-conversion


【解决方案1】:

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

因为编译器会通过 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 的转换优于从@987654337 的转换@到long

【讨论】:

  • 嗨乔恩,我已经更新了我的代码并添加了另一个带有字节参数的 Check 方法,但代码再次打印“我是一个 int”。为什么 3 被认为是一个 int 而不是一个字节?
  • 在 MSDN 网站上哪里可以找到这些规则?
  • @BudaGavril:我不会使用 MSDN - 我会下载完整的规范:microsoft.com/en-us/download/details.aspx?id=7029
  • 你能解释一下身份转换是什么意思吗?这是我在 msdn 上找到的内容:?身份转换可以从任何类型转换为相同类型。这种转换仅存在于可以说已经具有所需类型的实体可以转换为该类型。”但对我来说仍然不是很清楚
  • @Buda:正如它所说 - 这是从类型到自身的转换......在这种情况下,从 int 到 int。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-22
  • 1970-01-01
  • 1970-01-01
  • 2021-06-11
  • 1970-01-01
  • 2015-07-06
相关资源
最近更新 更多