条件运算符不能隐式转换?

条件运算符不能隐式转换?

我被这个小小的C#怪癖弄糊涂了:

给定变量:

Boolean aBoolValue;Byte aByteValue;

以下是汇编:

if (aBoolValue) 
    aByteValue = 1; else 
    aByteValue = 0;

但这不会:

aByteValue = aBoolValue ? 1 : 0;

错误说:“不能隐式地将‘int’类型转换为‘字节’。”

当然,这个怪物会汇编成:

aByteValue = aBoolValue ? (byte)1 : (byte)0;

这里发生了什么事?

编辑:

使用VS 2008,C#3.5


慕妹3146593
浏览 491回答 3
3回答

猛跑小猪

我使用VS 2005,for和我可以复制,用于bool&boole,但不用于true bool abool = true; Boolean aboolean = true; Byte by1 = (abool ? 1 : 2);    //Cannot implicitly convert type 'int' to 'byte' Byte by2 = (aboolean ? 1 : 2); //Cannot implicitly convert type 'int' to 'byte' Byte by3 = (true ? 1 : 2);     //Warning: unreachable code ;)最简单的解决办法似乎是这个演员。 Byte by1 = (Byte)(aboolean ? 1 : 2);因此,是的,似乎三元操作符导致常量将它们的类型“修正”为INT,并禁用隐式类型转换,否则您将从适合较小类型的常量中获得这种转换。

BIG阳

我可能没有很好的答案给你,但如果你在许多地方这样做,你可以声明:private static readonly Byte valueZero = (byte)0;private static readonly Byte valueOne = (byte)1;只有这些变量。你可以通过使用const如果它是本地的项目。编辑:使用readonly这是没有意义的-这些根本就不是要改变的。
打开App,查看更多内容
随时随地看视频慕课网APP