C#Enum需要三元组演员吗?

时间:2017-02-07 10:10:05

标签: c# enums casting ternary

今天我在Codegolf StackExchange进行了另一次Codegolf挑战,我试图这样做:

SomeEnum = SomeCondition ? 1 : 2;

但这告诉我Cannot convert source type 'int' to target type 'SomeEnum',所以我尝试了这个:

SomeEnum = SomeCondition ? (SomeEnum)1 : (SomeEnum)2;

然后解决了我的问题,但令我惊讶的是,这里的第一次演员据说是多余的。我的问题是:为什么我只需要将最后一个整数转换为 SomeEnum

4 个答案:

答案 0 :(得分:6)

条件运算符的规则是(C#Spec 7.14):

•   If x has type X and y has type Y then
o   If an implicit conversion (§6.1) exists from X to Y, but not from Y to X, then Y is the type of the conditional expression.
o   If an implicit conversion (§6.1) exists from Y to X, but not from X to Y, then X is the type of the conditional expression.
o   Otherwise, no expression type can be determined, and a compile-time error occurs.

通常,枚举和整数之间的任何一个方向都没有隐式转换。

那么,为什么你的代码有效?因为在您的实际代码中,第一个值是0,而不是1。所以我们得到一个整数可以隐式转换为枚举的情况(C#Spec 6.1.3):

  

隐式枚举转换允许 decimal-integer-literal 0转换为任何枚举类型和任何 nullable-type 其基础类型是枚举类型 ...

答案 1 :(得分:3)

你也可以这样写

SomeEnum = (SomeEnum)(SomeCondition ? 1 : 2);

左侧的SomeEnum总是期望结果为'SomeEnum'。所以我们需要转换它。

答案 2 :(得分:0)

要将结果绑定到三元运算符SomeEnum,两个分支(true和false)的结果应该能够隐式地转换为SomeEnum,但是默认情况下,没有隐式强制转换运算符为c#中的int类型定义enum。如果有隐式运算符,这将是有效的情况。

我希望这可以解释这种情况。

答案 3 :(得分:0)

此编译没有任何警告:

SomeEnum SomeEnum = (true) ? (SomeEnum)1 : (SomeEnum)2;

但是你应该为enum变量分配一个枚举值:

SomeEnum SomeEnum = (true) ? SomeEnum.First : SomeEnum.Second;

public enum SomeEnum : byte
{
    First = 1,
    Second = 2
}

以下编译:

SomeEnum SomeEnum = (true) ? (SomeEnum)1 : 2; //THIS WON'T COMPILE!

...除非第一个值为0:

SomeEnum SomeEnum = (true) ? 0 : 2;