【问题标题】:Why does a const int implicitly cast to a byte, but a variable int does not?为什么 const int 隐式转换为字节,而变量 int 没有?
【发布时间】:2012-01-29 01:18:25
【问题描述】:

以下程序将无法编译:

   class Program
   {
      static void Main(string[] args)
      {
         int x = 50;
         Byte[] y = new Byte[3] { x, x, x };
      }
   }

不出意外,我会收到错误Cannot implicitly convert type 'int' to 'byte'

但是,如果我将x 设为常量,那么它将编译:

   class Program
   {
      public const int x = 50;

      static void Main(string[] args)
      {
         Byte[] y = new Byte[3] { x, x, x };
      }
   }

我很好奇这里发生了什么。如果不能将int 隐式转换为字节,编译器是否会即时创建我的 const 的“字节”版本,还是像我进行显式转换一样对其进行编译,因为它认为是常量值一个字节的“安全”?也许编译器会像我这样解释:

Byte[] y = new Byte[3] { 50, 50, 50 };

因为这是合法的,所以我更好奇编译器在这里做了什么。

【问题讨论】:

标签: c# .net clr


【解决方案1】:

请参阅 C# 4 规范的第 6.1.9 节,其中指出:

如果常量表达式的值在目标类型的范围内,则可以将 int 类型的常量表达式转换为 sbyte、byte、short、ushort、uint 或 ulong 类型。

你的问题是:

编译器是即时创建我的 const 的“字节”版本,还是像我进行显式转换一样编译它,因为它认为常量值对于一个字节是“安全的”?

我不明白这两件事之间的区别;在我看来,它们听起来是一样的。

【讨论】:

  • 啊,规范中的引用正是我想要的。谢谢!
【解决方案2】:

编译器只会将常量视为您在其中写入数字,但需要进行隐式转换。

在你的第三个 sn-p 中,这三个 50 都是 System.Int32。将鼠标悬停在它上面并阅读 Visual Studio 中的工具提示。为什么这里没有编译器错误?因为编译器在编译时就知道该值,并且知道它将适合 byte

【讨论】:

    【解决方案3】:

    非常量值有可能对于一个字节来说太大了,而常数值是恒定的,并且在这种情况下保证低于阈值。

    【讨论】:

      【解决方案4】:

      常量在编译时被“嵌入”。

      如何编译常量的一个值得注意的结果是,如果您针对程序集进行编译,它将在编译时使用常量值。如果您稍后在运行时绑定到不同版本的程序集,它将使用原始常量,即使它们在新版本的程序集中已更改。这也特别适用于枚举常量。这个故事的寓意是(公共)不变的价值观确实应该是不变的。如果有可能发生有意义的更改,请改用静态只读字段。

      【讨论】:

        【解决方案5】:

        基本上它归结为不同的是,当编译器在编译时知道该值时,允许强制转换是较大数字类型的值在较小数字类型的允许范围内。如果编译器不知道是否是这种情况,则不允许这样做,除非您使用显式转换来确保它在程序运行时会在该范围内。

        尽管我们知道 x 的值在其声明和使用之间不太可能发生变化,但要确定它不会改变需要编译器不会尝试的复杂分析(实际上不可能总是得到正确的)。如果变量不是 const,则编译器不会推断其实际值。

        【讨论】:

          【解决方案6】:

          答案是:因为 const 被预处理器例程变成文字,并被解释为“代码”,而变量则不会。

          【讨论】:

            猜你喜欢
            • 2013-10-05
            • 2023-04-08
            • 2017-04-11
            • 2015-01-05
            • 2010-12-01
            • 2020-12-14
            • 2016-11-11
            • 2013-01-19
            • 2013-01-01
            相关资源
            最近更新 更多