首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#三元与String.Equals的结合

C#三元与String.Equals的结合
EN

Stack Overflow用户
提问于 2014-08-01 14:38:02
回答 4查看 3.7K关注 0票数 31

这样做是可行的:

代码语言:javascript
复制
short value;
value = 10 > 4 ? 5 : 10;

这样做是可行的:

代码语言:javascript
复制
short value;
value = "test" == "test" ? 5 : 10;

这不管用:

代码语言:javascript
复制
short value;
string str = "test";
value = "test" == str ? 5 : 10;

这一点也不是:

代码语言:javascript
复制
short value;
string str = "test";
value = "test".Equals(str) ? 5 : 10;

在最后两种情况下,我得到了以下错误:

代码语言:javascript
复制
Cannot implicitly convert type 'int' to 'short'.
An explicit conversion exists (are you missing a cast?)

为甚麽我要在最后两宗而不是前两宗上投呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-08-01 14:44:03

代码语言:javascript
复制
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)在编译时不能解析为常数。因此,编译器将510视为int文本,整个三元表达式的类型为int。要从int转换为short,需要显式的强制转换。

前两个三元表达式(1,2)可以在编译时解析为常数。常量值是int,但编译器知道它适合于short,因此不需要任何转换。

为了好玩,试试这个:

代码语言:javascript
复制
value = "test" == "test" ? 5 : (int)short.MaxValue + 1;
票数 45
EN

Stack Overflow用户

发布于 2014-08-01 14:49:16

您需要一个强制转换来使最后两个示例正常工作。

代码语言:javascript
复制
value = (short)("test" == str ? 5 : 10);

为什么你不需要在前两个呢?

因为前两个是编译时常量。编译器能够将10 > 4 ? 5 : 10转换为true ? 5 : 10,然后只转换为5

所以当你写

代码语言:javascript
复制
value = 10 > 4 ? 5 : 10;

实际上,这和

代码语言:javascript
复制
value = 5;

它的编译是因为编译器允许在允许的范围内隐式转换常量。

相反,"test" == str ? 5 : 10;不是编译时间常数,因此不允许编译强制转换它。你需要自己做一个明确的演员阵容。

票数 4
EN

Stack Overflow用户

发布于 2014-08-04 00:45:40

当然,这是由C#语言规范定义的。

需要注意的关键是,有两种从intshort的转换。一种是显式转换,它总是应用,但需要在(short)表达式之前显式地编写int。另一个是http://msdn.microsoft.com/en-us/library/aa691286.aspx,它只适用于(a) int表达式是编译时常量和(b)这个编译时表达式的值在short的范围内,即-32768通过32767

5104这样的文字在C#中有int类型(对于在-21474836482147483647之间的任何整数字面值,而不是后面跟着符号LU或类似的)。所以,如果我们看看所有作业的右边,它们显然是int表达式,而不是short

10 > 4 ? 5 : 10中,由于104是编译时常量,所以这与true ? 5 : 10相同,因为ints之间的>操作符是内置的,当操作数是常量时,会产生一个常数。同样,true ? 5 : 10给出了5,因为所有三个操作数都是常量,在这种情况下,?:本身被归类为一个常量。所以它真的说:

代码语言:javascript
复制
short value = 5;

其中"5“是编译时常量。因此,如果int 5在此范围内,则在编译时对其进行检查(与10无关,它可能是999999),而且由于情况如此,隐式常量表达式转换适用,并且是合法的。

请注意,您可以对以下内容执行相同的操作:

代码语言:javascript
复制
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等也会发生同样的情况,因此字符串在这方面并不特殊。

很可能你已经知道

代码语言:javascript
复制
short value = cond ? 5 : 10;

因为cond不是编译时常量,所以不允许使用显式转换,所以编写:

代码语言:javascript
复制
short value = cond ? (short)5 : (short)10;

或者:

代码语言:javascript
复制
short value = (short)(cond ? 5 : 10);

从技术上讲,它们是不一样的,因为第一个在运行时没有缩小转换(表达式(short)5(short)10short类型的文字),而最后一个必须在运行时将int转换为short (这当然比难以置信的便宜)。

另一个(不删除!)答案是正确的,这只是奖金信息。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25082668

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档