C#三元运算符的一个有趣的问题

SilverNet 2010-10-27 03:21:40
写法一,程序报错

bool flag = true;
short checkFlag = flag ? 1 : 0;


写法二,编译通过

short checkFlag = true ? 1 : 0;


写法三,编译通过

bool flag = true;
short checkFlag = flag ? Convert.ToInt16(1) : Convert.ToInt16(0);


请问写法一与写法二有什么区别,导致编译结果不同?
...全文
571 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
兔子-顾问 2010-10-27
  • 打赏
  • 举报
回复
short checkFlag1 = 1;
貌似没报错。从2005~2010,不知道你用的什么版本vs.
SilverNet 2010-10-27
  • 打赏
  • 举报
回复
不好意思,搞错了,直接short checkFlag1 = 1 不会报错。谢谢大家帮助。
SilverNet 2010-10-27
  • 打赏
  • 举报
回复
但是还有个疑问,但是我单纯使用
short checkFlag1 = 1; 也是会报错的,难道常量编译的时候还能发现等号左方的是short类型,然后自动把常量计算的结果换成short类型吗?
兔子-顾问 2010-10-27
  • 打赏
  • 举报
回复
怎么证实我说的呢。这样测试的
bool flag = true;
short checkFlag = (short)(flag ? 1 : 0);
short checkFlag1 = true ? 1 : 0;

编译后用reflector打开反编译。可以看到代码被优化为:
bool flag = true;
short checkFlag = flag ? ((short) 1) : ((short) 0);
short checkFlag1 = 1;

SilverNet 2010-10-27
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 phil999 的回复:]
写法1,运行时int不能赋给short
写法2,由于true是常量,编译时可以计算表达式的值,这和 short checkFlag = 1; 是一回事
写法3,没什么好说的

写法 1 改成这样,就可以编译
const bool flag = true;
short checkFlag = flag ? 1 : 0;
[/Quote]

哦,谢谢,的确是这个原因。刚看了一下MSDN,第二种写法话因该是当成常数表达式运行。而常数表达式是在编译时可被完全计算的表达式。所以结果不同,谢谢。
兔子-顾问 2010-10-27
  • 打赏
  • 举报
回复
写法2是编译器优化过的。因为true是常量,编译器优化后结果为:
short checkFlag1 = 1;
这就是标准的short初始化语句,所以不会报错。
这里和三目运算符的问号表达式无关,问号表达式返回的是int。
wuyq11 2010-10-27
  • 打赏
  • 举报
回复
,short, int, long, fload, double 等,根据这个排列顺序
各种类型的值依次可以向后自动进行转换。
应该使用强制类型转换
short g = 1;
byte h = (byte) g;
特别 2010-10-27
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 silvernet 的回复:]
引用 2 楼 sdfkfkd 的回复:
bool flag = true;
short checkFlag = flag ? 1 : 0;

你的checkFlag是short类型,而你的结果 1 0 是int类型
在C#中,单纯地写一个不带小数的数值,默认为int类型
所以3的写法才正确


我可以单纯定义一个short类型的数字吗?而不强转
[/Quote]
short类型没好象没有后辍 表示法
其他的一些

3.5F 表示float
3.5D 表示double
3.5m 表示decimal
3.5 表示double
3 表示int
3L 表示long
ljb3326 2010-10-27
  • 打赏
  • 举报
回复
哦 学习!!!!!!!!!!!
phil999 2010-10-27
  • 打赏
  • 举报
回复
写法1,运行时int不能赋给short
写法2,由于true是常量,编译时可以计算表达式的值,这和 short checkFlag = 1; 是一回事
写法3,没什么好说的

写法 1 改成这样,就可以编译
const bool flag = true;
short checkFlag = flag ? 1 : 0;




SilverNet 2010-10-27
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 linwanhai 的回复:]
写法一要是不错就是你的电脑出问题了
[/Quote]

:)那写法二不出错,是什么出问题了。
linwanhai 2010-10-27
  • 打赏
  • 举报
回复
写法一要是不错就是你的电脑出问题了
SilverNet 2010-10-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 sdfkfkd 的回复:]
bool flag = true;
short checkFlag = flag ? 1 : 0;

你的checkFlag是short类型,而你的结果 1 0 是int类型
在C#中,单纯地写一个不带小数的数值,默认为int类型
所以3的写法才正确
[/Quote]

我可以单纯定义一个short类型的数字吗?而不强转
air123456789 2010-10-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 sdfkfkd 的回复:]

bool flag = true;
short checkFlag = flag ? 1 : 0;

你的checkFlag是short类型,而你的结果 1 0 是int类型
在C#中,单纯地写一个不带小数的数值,默认为int类型
所以3的写法才正确
[/Quote]
原来是这样、。
特别 2010-10-27
  • 打赏
  • 举报
回复
奇怪,2的写法难道能通过编译吗
特别 2010-10-27
  • 打赏
  • 举报
回复
bool flag = true;
short checkFlag = flag ? 1 : 0;

你的checkFlag是short类型,而你的结果 1 0 是int类型
在C#中,单纯地写一个不带小数的数值,默认为int类型
所以3的写法才正确
air123456789 2010-10-27
  • 打赏
  • 举报
回复
方法1 应该是因为已经写了类型了。

111,097

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧