10

フラグ属性を持つ列挙型が主にビット単位の操作に使用されるかどうか疑問に思っていました。列挙型の値が定義されていない場合、コンパイラが値を自動生成しないのはなぜですか。

たとえば。

【フラグ】
public enum MyColor
{
    黄色 = 1、
    緑 = 2、
    赤 = 4、
    青 = 8
}

値 1、2、4、8 が割り当てられていない場合に自動生成されると便利です。これについてのあなたの考えを知りたいです。

4

4 に答える 4

13

これは少し簡単です:

[Flags]
public enum MyColor
{
    Yellow = 1<<0,
    Green = 1<<1,
    Red = 1<<2,
    Blue = 1<<3
}
于 2009-11-24T19:44:41.330 に答える
3

FlagsAttributeインスタンスが列挙型と一緒に、または列挙型の後にコンパイルされているためだと思います。つまり、オブジェクトを属性([Flags]など)で装飾すると、属性オブジェクトが作成されますが、基本的な方法でベースオブジェクトが変更されることはありません。

また、(属性の実行時インスタンス化のために)格納される情報の一部は、それが参照するエンティティです。エンティティの列挙型はその属性の前にコンパイルする必要があるため、属性が参照するエンティティ(この場合は列挙型)に影響を与えることはできません。私はこの声明が真実であるかどうかわかりません、それはただの推測です。

大きなポイントは、[Flags]のような属性は実際にはエンティティ自体であり、装飾されたタイプの変更ではないということです。

于 2009-11-24T20:38:44.747 に答える
3

おそらく可能ですが、このサイズのコンパイラでは、何かを実装するために必要な時間とリソースと潜在的な利益を考慮する必要があります。特に、このようなシンタックス シュガーではそうです。手動で記述できるため、単なるシンタックス シュガーにすぎません。

于 2009-11-24T19:42:54.827 に答える