为什么没有必要为这个C#函数强制转换?

时间:2014-11-22 12:12:41

标签: c# casting int short

使用C#;我刚刚意识到,将noValueNumber声明为const int并从此short函数返回。
为什么没有错误消息,例如:

  

无法将表达式int转换为返回类型short

    public static short ValueFromString(string onlyNumbersString)
    {
        if (onlyNumbersString.Length == 0)
        {
            const int noValueNumber = 999;

            return noValueNumber; // ¿...? 
        }

        return Int16.Parse(onlyNumbersString);
    }

不应该是演员吗?或者有,但隐藏?

4 个答案:

答案 0 :(得分:3)

MSDN提到:

  

您无法隐式将较大存储空间的非自然数字类型转换为短[...]

适合short的(常量)值虽然可以通过隐式转换来实现。

修改:为您的示例Implicit Numeric Conversions Table (C# Reference)找到正确的(正面)文档,其中指出:

  

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

答案 1 :(得分:1)

这是因为编译器足够聪明,可以看到999是正确的short值而且是const所以它不会被更改(noValueNumber的使用可以实际上由这个值替换简单)。如果您将尝试返回40000,则会出现编译错误:

  

常数值' 40000'无法转换为'短'

换句话说,如果您删除const,您将获得预期:

  

无法隐式转换类型' int'短暂的'。存在显式转换(您是否错过了演员?)

换句话说,如果你反编译你的orignal函数,你得到:

public static short ValueFromString(string onlyNumbersString)
{
    short result;
    if (onlyNumbersString.Length == 0)
    {
        result = 999;
    }
    else
    {
        result = short.Parse(onlyNumbersString);
    }
    return result;
}

这就是编译器"看到"这段代码,如你所见,这里根本没有const int

答案 2 :(得分:0)

我之所以这样说是因为您已将变量定义为a constant,其值为999(这是一个有效的Int16值),因此可以轻松使用它。如果您从定义中删除const,它将停止工作。智能编译器:)

答案 3 :(得分:0)

999是有效的short号码。由于您使用const int noValueNumber(此处const为关键字),因此名称noValueNumber将用作999的别名。在预编译处理期间,noValueNumber的每次出现都替换为999,因此编译的代码实际上是return 999;