1

在阅读了最近的问题之后,在另一个枚举声明中允许不同枚举类型之间的操作,但在其他地方不允许,我想出了这个例子:

    enum Alpha : long
    {
        X,
    }

    enum Beta : ulong
    {
        X,
    }

    enum Gamma : long
    {
        X = Alpha.X | Beta.X,   // problem?
    }

    enum Delta : ulong
    {
        X = Alpha.X | Beta.X,   // no problem?
    }

编译结果:Gamma不会编译(CS0266:无法将类型“ulong”隐式转换为“long”。存在显式转换(您是否缺少演员表?))。Delta编译愉快。

难道不是 C# 语言规范所期望的吗?

Alpha(注意:如果我将要初始化的成员更改为负常量,例如-1L,那么既Gamma不会也Delta不会编译。)

4

2 回答 2

1

是的,这是预期的,它不是特定于枚举的。您可以将其简化为:

long a = 1L | 1UL; // Cannot implicitly convert type 'ulong' to 'long'. An explicit conversion exists (are you missing a cast?)
ulong b = 1L | 1UL;

C# 语言规范中的以下引用描述了它发生的原因。

6.1.9 隐式常量表达式转换

隐式常量表达式转换允许以下转换:

· 如果常量表达式的值在目标类型的范围内,则 int 类型的常量表达式(第 7.19 节)可以转换为 sbyte、byte、short、ushort、uint 或 ulong 类型。

· long 类型的常量表达式可以转换为 ulong 类型,前提是常量表达式的值不是负数。

6.1.2 隐式数值转换

隐式数字转换是:

· 从 long 到 float、double 或 decimal。

· 从 ulong 到 float、double 或 decimal。

换句话说,Alpha.X(如果基础值为正)可以(实际上是!)隐式转换为ulong. 但是Alpha.X | Beta.Xis的结果ulong,根据规范,不能隐式转换为long.

但是,一旦将Alpha.X要初始化的 更改为负常量,例如-1L,那么根据上面的引用,它就不能再被隐式转换为ulong并且编译将失败并出现不同的错误:Operator '|' cannot be applied to operands of type 'long' and 'ulong'

于 2013-01-27T00:48:34.677 回答
0

是的,这是意料之中的,没有从 ulong 到任何整数类型的隐式转换。

一旦你告诉编译器你 long 是 -ve,你就给它足够的信息说你不想那样做。

就我个人而言,我会很高兴它对长时间感到不安 | ulong,但毫无疑问,一些 C 程序员影响了这个决定。:(

于 2013-01-27T00:35:12.650 回答