C#:将'0'转换为int

Dim*_*nev 12 c# casting

我看到这样的代码:

private readonly object[] m_Values = { (int)0, (int)0 };
Run Code Online (Sandbox Code Playgroud)

将0转换为int的想法是什么?不是'默认'的int吗?

Han*_*ant 17

没有必要.我假设程序员之前被咬过了.我会把它作为一个益智游戏发布,在这个程序中会调用哪个超载?

using System;

class Program {
    static void Main(string[] args) {
        Foo.Bar(0);
        Console.ReadLine();
    }
}

class Foo {
    public static void Bar(byte arg)  { Console.WriteLine("byte overload"); }
    public static void Bar(short arg) { Console.WriteLine("short overload"); }
    public static void Bar(long arg)  { Console.WriteLine("long overload"); }
}
Run Code Online (Sandbox Code Playgroud)

  • 推理是:一个常数整数*可以隐式转换为*它适合的任何整数类型,因此所有三种方法都适用*.我们现在必须确定三种适用方法中哪一种最佳*.它是具有最*特定*参数类型的那个.类型X比类型Y更具体,如果"所有X都可以转换为Y而不是所有Y都可以转换为X".也就是说,长颈鹿比动物更具特异性,因为所有长颈鹿都是动物,但反之亦然.byte比short或long更具体,所以它赢了. (6认同)
  • 对不起,我无法提供"为什么",这对我没有意义;)值得注意的是VB会选择长时间超载.这是EncoderParameter类的一个真正问题,它没有一个带有int的构造函数.只是另一个伏都教的小辫子,我塞在大脑的一角,要小心.但另有说明,有人可能最终认为0的类型不一定是*int*. (5认同)
  • +1有趣.你打算提供结果背后的"原因"吗?我假设在重载决策之后有一条路径说明如果文字不能进入定义的默认类型,给定文字的最小包含类型是什么. (3认同)
  • 我得到了错误的答案.我发现有趣的是"int zero = 0; Foo.Bar(zero);" 得到了我期待的答案,但是"const int zero = 0; Foo.Bar(zero);" 得到了与益智游戏相同的答案. (2认同)
  • @Eric - 圣经部分2.4.4.2:"整数文字用于写入int,uint,long和ulong类型的值".在那一章中,没有长颈鹿看起来像一个字节.你可以把它称为一个功能,无论如何每个人都对它完全混淆.那么,您可以添加一个规则来添加到代码分析工具中. (2认同)

Hab*_*bib 5

我认为这样做是没有意义的,但我认为唯一有用的地方是原始编码器希望阻止将该值转换为其他数据类型的地方.考虑这个例子:

object[] m_Values = { (int)0, (int)0 };
Int16 item = (Int16) m_Values[0];
Run Code Online (Sandbox Code Playgroud)

要么

object[] m_Values = { (int)0, (int)0 };
Int64 item = (Int64)m_Values[0];
Run Code Online (Sandbox Code Playgroud)

以上将导致

指定演员表无效.

但是下面会有效:

object[] m_Values = { (int)0, (int)0 };
int item = (int)m_Values[0];
Run Code Online (Sandbox Code Playgroud)