6

これは反対票を投じられるかもしれませんが、この質問は昨日から私を悩ませてきました..リンクを見つけるまで、私は本当にクレイジーではないことを知っていましたlol: インスタンス変数としての列挙型

私は基本的にOPの質問の反対を求めています。与えられた:

enum Coffee {
    BIG,
    SMALL }

public class MyClass {
    private Coffee coffee;

    // Constructor etc.
}

これはJavaであり、列挙型は両方の言語で多少異なりますが、coffee.BIGまたはcoffee.BIG.SMALLを実行できないのはどうしてですか(読むときはほとんど意味がありませんが、コーヒーがCoffeeタイプであることを考慮すると可能です。 )C#で?

4

2 に答える 2

10

これは実際には列挙型とは関係ありません。これは、一般的に静的メンバーにアクセスすることと関係があります。

Javaには設計上の欠陥(IMO)があり、静的メンバーに、そのタイプの式を介して、インスタンスメンバーであるかのようにアクセスできます。非常に紛らわしいコードにつながる可能性があります。

Thread thread = new Thread(...);
thread.start();
// This looks like it makes the new thread sleep, but it actually makes the
// current thread sleep
thread.sleep(1000);

さらに、式の値は無関係であるため、ヌルチェックはありません。

Thread thread = null;
thread.sleep(1000); // No exception

ここで、列挙値が暗黙的に静的であると考えてください。違いがある理由がわかります。

「それを読むときはほとんど意味がない」ことを認めたという事実は、これがC#内ではなく、Java内の欠陥であることに心から同意していることを示唆しています:)

于 2012-08-12T08:06:14.113 に答える
4

C#では(Javaとは異なり)、そのクラスのインスタンスを介して静的フィールドにアクセスすることは違法です。

これを書く場合:

coffee.BIG.SMALL

次に、発生するエラーは次のとおりです。

メンバー'coffee.SMALL'には、インスタンス参照を使用してアクセスできません。代わりにタイプ名で修飾してください

このコードも同じ理由で機能しません。

void Foo(coffee c)
{
    // Member 'coffee.SMALL' cannot be accessed with an instance reference
    Console.WriteLine(c.SMALL); 
}
于 2012-08-12T08:06:04.873 に答える