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ません。)GammaDelta

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型の定数式は、constant-expressionの値が負でない限り、ulong型に変換できます。

6.1.2暗黙の数値変換

暗黙の数値変換は次のとおりです。

・longからfloat、double、またはdecimalまで。

ウロンからfloat、double、またはdecimalまで。

言い換えると、Alpha.X(基になる値が正の場合)暗黙的にに変換できます(実際にはそうです!)ulong。ただし、の結果Alpha.X | Beta.Xulongであり、仕様によれば、暗黙的にに変換することはできませんlong

ただし、をのAlpha.Xように初期化するように負の定数に変更すると-1L、上記の引用によれば、暗黙的に変換できなくなりulong、コンパイルは別のエラーで失敗します。Operator '|' cannot be applied to operands of type 'long' and 'ulong'

于 2013-01-27T00:48:34.677 に答える
0

はい、それは予想されます。ulongから任意の整数型への暗黙の変換はありません。

あなたが長い間-veであることをコンパイラに伝えるとすぐに、あなたはそれを言うのに十分な情報を与えます、あなたはそれをしたくないのです。

個人的に私はそれが長い間動揺して幸せだったでしょう| ulongですが、間違いなく一部のCプログラマーがその決定に影響を与えました。:(

于 2013-01-27T00:35:12.650 に答える