C# 但这并不能真正解释为什么编译器不能找出5和10都可以是短的,除了明显的“因为它不能”。@ahruss编译器完全可以找出5和10都可以是短的。问题是,如果E表达式是否为B?X:Y其中B是一个非常数bool表达式,那么E始终被解释为一个非常数表达式,无论X和Y
C# 但这并不能真正解释为什么编译器不能找出5和10都可以是短的,除了明显的“因为它不能”。@ahruss编译器完全可以找出5和10都可以是短的。问题是,如果E表达式是否为B?X:Y其中B是一个非常数bool表达式,那么E始终被解释为一个非常数表达式,无论X和Y,c#,.net,C#,.net,但这并不能真正解释为什么编译器不能找出5和10都可以是短的,除了明显的“因为它不能”。@ahruss编译器完全可以找出5和10都可以是短的。问题是,如果E表达式是否为B?X:Y其中B是一个非常数bool表达式,那么E始终被解释为一个非常数表达式,无论X和Y是否为常数。如果X是5而Y是10,则这些表达式的类型都是int。因此,E是非常量,并且具有类型int。非常量int不能隐式转换为short@ahruss(续)编译器按常量与非常量进行推理-它不保留非常量变量的边界。您提出的推理要求编译器说B?5
但这并不能真正解释为什么编译器不能找出5和10都可以是短的,除了明显的“因为它不能”。@ahruss编译器完全可以找出5和10都可以是
短的。问题是,如果E
表达式是否为B?X:Y
其中B
是一个非常数bool
表达式,那么E
始终被解释为一个非常数表达式,无论X
和Y
是否为常数。如果X
是5
而Y
是10
,则这些表达式的类型都是int
。因此,E
是非常量,并且具有类型int
。非常量int
不能隐式转换为short
@ahruss(续)编译器按常量与非常量进行推理-它不保留非常量变量的边界。您提出的推理要求编译器说B?5:10始终是[5,10]
中的一个值。它不是等于value=5而不是10吗?对。这是匆忙写的。修正了。@Tyler:真的,对不起,取消了接近票数的投票。我给的那份副本不具体。说明编译时(=)和运行时(等于)之间的差异。此外,10>4将由编译器进行优化,其中一个变量在大部分时间都是经过检查的运行时(不是常数)可能完全正确的副本。对于(short)(“test”==str?5:10)
和“test”==str?之间的“学术”差异?(短)5:(短)10
,见我的答案。
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;
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
value = "test" == "test" ? 5 : (int)short.MaxValue + 1;
value = 5;
value = (short)("test" == str ? 5 : 10);
value = 10 > 4 ? 5 : 10;
value = 5;
short value = 5;
const int huge = 10;
const int tiny = 4;
const int significant = 5;
const int unimporatnt = 10;
short value;
value = huge > tiny ? significant : unimportant;
short value = cond ? 5 : 10;
short value = cond ? (short)5 : (short)10;
short value = (short)(cond ? 5 : 10);