使用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);
}
不应该是演员吗?或者有,但隐藏?
答案 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;
。