这样做是可行的:
short value;
value = 10 > 4 ? 5 : 10;这样做是可行的:
short value;
value = "test" == "test" ? 5 : 10;这不管用:
short value;
string str = "test";
value = "test" == str ? 5 : 10;这一点也不是:
short value;
string str = "test";
value = "test".Equals(str) ? 5 : 10;在最后两种情况下,我得到了以下错误:
Cannot implicitly convert type 'int' to 'short'.
An explicit conversion exists (are you missing a cast?)为甚麽我要在最后两宗而不是前两宗上投呢?
发布于 2014-08-01 14:44:03
short value;
value = 10 > 4 ? 5 : 10; //1
value = "test" == "test" ? 5 : 10; //2
string str = "test";
value = "test" == str ? 5 : 10; //3
value = "test".Equals(str) ? 5 : 10; //4最后两个三元表达式(3,4)在编译时不能解析为常数。因此,编译器将5和10视为int文本,整个三元表达式的类型为int。要从int转换为short,需要显式的强制转换。
前两个三元表达式(1,2)可以在编译时解析为常数。常量值是int,但编译器知道它适合于short,因此不需要任何转换。
为了好玩,试试这个:
value = "test" == "test" ? 5 : (int)short.MaxValue + 1;发布于 2014-08-01 14:49:16
您需要一个强制转换来使最后两个示例正常工作。
value = (short)("test" == str ? 5 : 10);为什么你不需要在前两个呢?
因为前两个是编译时常量。编译器能够将10 > 4 ? 5 : 10转换为true ? 5 : 10,然后只转换为5。
所以当你写
value = 10 > 4 ? 5 : 10;实际上,这和
value = 5;它的编译是因为编译器允许在允许的范围内隐式转换常量。
相反,"test" == str ? 5 : 10;不是编译时间常数,因此不允许编译强制转换它。你需要自己做一个明确的演员阵容。
发布于 2014-08-04 00:45:40
当然,这是由C#语言规范定义的。
需要注意的关键是,有两种从int到short的转换。一种是显式转换,它总是应用,但需要在(short)表达式之前显式地编写int。另一个是http://msdn.microsoft.com/en-us/library/aa691286.aspx,它只适用于(a) int表达式是编译时常量和(b)这个编译时表达式的值在short的范围内,即-32768通过32767。
像5、10或4这样的文字在C#中有int类型(对于在-2147483648和2147483647之间的任何整数字面值,而不是后面跟着符号L、U或类似的)。所以,如果我们看看所有作业的右边,它们显然是int表达式,而不是short。
在10 > 4 ? 5 : 10中,由于10和4是编译时常量,所以这与true ? 5 : 10相同,因为ints之间的>操作符是内置的,当操作数是常量时,会产生一个常数。同样,true ? 5 : 10给出了5,因为所有三个操作数都是常量,在这种情况下,?:本身被归类为一个常量。所以它真的说:
short value = 5;其中"5“是编译时常量。因此,如果int 5在此范围内,则在编译时对其进行检查(与10无关,它可能是999999),而且由于情况如此,隐式常量表达式转换适用,并且是合法的。
请注意,您可以对以下内容执行相同的操作:
const int huge = 10;
const int tiny = 4;
const int significant = 5;
const int unimporatnt = 10;
short value;
value = huge > tiny ? significant : unimportant;只要所有操作数都是const变量(双关语?)。
现在,如果我能够解释清楚,到现在为止,您还会知道阻止value = "test" == str ? 5 : 10;工作的障碍是您没有将str本地标记为const。这样做,它就会被允许。
有了Equals调用,情况就更糟了。调用Equals的结果从未被视为编译时常量(我不认为它是“优化”的,例如,"same".Equals("same")将在运行时实际调用该方法)。(10).Equals(4)或(10).CompareTo(4) > 0等也会发生同样的情况,因此字符串在这方面并不特殊。
很可能你已经知道
short value = cond ? 5 : 10;因为cond不是编译时常量,所以不允许使用显式转换,所以编写:
short value = cond ? (short)5 : (short)10;或者:
short value = (short)(cond ? 5 : 10);从技术上讲,它们是不一样的,因为第一个在运行时没有缩小转换(表达式(short)5和(short)10是short类型的文字),而最后一个必须在运行时将int转换为short (这当然比难以置信的便宜)。
另一个(不删除!)答案是正确的,这只是奖金信息。
https://stackoverflow.com/questions/25082668
复制相似问题