2012-08-12 9 views
6

To może dostać downvoted, ale ta kwestia została nurtujące mnie od wczoraj .. aż znalazłem link wtedy wiedziałem, że nie było naprawdę szalone lol: Enum as instance variablesDlaczego nie możemy uzyskać dostępu do wartości wyliczeniowych z instancji wyliczeniowej w C#?

Ja w zasadzie pytaniem przeciwieństwem OP pytanie. Biorąc pod uwagę:

enum Coffee { 
    BIG, 
    SMALL } 

public class MyClass { 
    private Coffee coffee; 

    // Constructor etc. 
} 

Chociaż to jest Java teksty stałe i różnią się nieco w obu językach, jak to jest, że nie mogę zrobić coffee.BIG lub coffee.BIG.SMALL (choć nie ma większego sensu, gdy go przeczytać, powinno być możliwe, biorąc pod uwagę, że kawa jest typu Kawa) w C#?

Odpowiedz

10

To nie jest naprawdę do czynienia z teksty stałe. Ma to związek z dostępem do statycznych członków w ogóle.

Java ma wadę projektową (IMO), która umożliwia dostęp do statycznych elementów, tak jakby były członkami instancji, za pośrednictwem tego typu wyrażenia. Może to prowadzić do bardzo mylące kod:

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); 

Dodatkowo, nie ma check nieważność jako wartość wyrażenia jest bez znaczenia:

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

Teraz uważają, że wartości wyliczeniowe są niejawnie statycznych i możesz zobaczyć, dlaczego istnieje różnica.

Fakt, że pan przyznał, że „nie ma sensu, gdy czyta je” sugeruje, że w sercu zgadzasz się, że jest to wada w ciągu Java, C# nie w ciągu :)

+0

O tak, teraz ma to sens. Wreszcie odpowiedź! : P –

4

W języku C# (w przeciwieństwie do Java) dostęp do pola statycznego za pośrednictwem instancji tej klasy nie jest legalny.

Jeśli piszesz tak:

coffee.BIG.SMALL 

Następnie błędu masz jest:

'coffee.SMALL' Państwa nie mogą być dostępne z odniesieniem instancji; zakwalifikować go z nazwą typu zamiast

Ten kod nie będzie działać również z tego samego powodu:

void Foo(coffee c) 
{ 
    // Member 'coffee.SMALL' cannot be accessed with an instance reference 
    Console.WriteLine(c.SMALL); 
} 
+3

+1 i jego zwykły mylące w Jawa. –

+0

Ma sens, dziękuję :) –

Powiązane problemy