2012-05-11 26 views
101

Czy nie jest var słowo kluczowe w języku C#? Ale dlaczego ja mogę to zrobić:Dlaczego mogę utworzyć klasę o nazwie "var"?

public class var { } 

public class main 
{ 
    public static void main(string[] args) 
    { 
     var testVar = new var(); 
    } 
} 

var, który jest używany w kodzie jest klasa var że jest zadeklarowana przed klasą main. I kompilator nawet nie narzeka.

Podczas kiedy to zrobić:

public class int { } 

lub to:

public class true { } 

Kompilator że int lub true jest kluczowe i nie mogą być wykorzystywane w taki sposób. Dlaczego nie jest tak samo z var?

+6

Dlaczego chcesz? Tak mylące i trudne do odczytania. – duffymo

+0

co z "dynamicznym" słowem kluczowym? Czy można go również użyć? –

+6

Przeczytaj to: http://blogs.msdn.com/b/ericlippert/archive/2009/05/11/reserved-and-contextual-keywords.aspx – AakashM

Odpowiedz

101

var nie jest słowem kluczowym according to this list.

jest słowem kluczowym kontekstualnym, więc z kontekstu kompilator jest w stanie zdecydować, która jest twoją klasą i która jest kontekstowym słowem kluczowym, i nie powstaje zamieszanie.

kluczowe kontekstowa jest:

wykorzystane do zapewnienia szczególnego znaczenia w kodzie, ale nie jest to zastrzeżone słowo w C#.

, ponieważ nie jest zarezerwowany, możesz go użyć.

Jak zauważył w komentarzach powyżej znajduje się omówienie różnic, jak również wykaz poszczególnych słów kluczowych i kontekstowe słowa kluczowe dodawane w każdej wersji C# na Eric Lipperts blog

Warto zwrócić uwagę, że ponieważ zestaw słów kluczowych ustalono w C# 1.0 nie było żadnych dodatków, aby zachować kompatybilność wsteczną.

+1

Jednak jest podzielone na kategorie w "C# Keywords" tutaj http://msdn.microsoft.com/en-us/library/bb383973.aspx ... mylące! – Richard

+4

Ale jest to ["Słowo kontekstowe"] (http://msdn.microsoft.com/en-us/library/x53a06bb.aspx). _ "Słowo kluczowe kontekstowe służy do nadania określonego znaczenia w kodzie, ale ** nie jest słowem zastrzeżonym w języku C# **. Niektóre słowa kluczowe kontekstowe, takie jak częściowe i gdzie mają specjalne znaczenie w dwóch lub więcej kontekstach." _ –

+5

@TimSchmelter Następnie "var" jest "słowem kluczowym". Po prostu nie "zastrzeżone słowo", prawda? – luiscubal

18

Kompilator jest wystarczająco inteligentny, aby wiedzieć, że kontekst, którego używasz, var jako nazwa klasy nigdy nie jest kontekstem słowa kluczowego, więc pozwala na to (dlatego jest zdefiniowany jako contextual keyword).

+0

Myślę, że ta odpowiedź jest co najmniej trochę myląca. Kompilator nie jest dokładnie "wystarczająco inteligentny", aby określić, czy 'var' jest używany jako słowo kluczowe w kodzie, jak' var testVar = new var(); '. Tak, kontekst, pod względem tego, czy określony został niestandardowy typ o nazwie 'var', ale właśnie dlatego, że kompilator jest * nie * wystarczająco inteligentny w tych przypadkach, aby wiedzieć, czy' var testVar' odnosi się do klasy ' var' lub do słowa kluczowego 'var', które domyślnie odpowiada klasie w takim kontekście. Gdyby słowo kluczowe "var" zostało nazwane inaczej, mogłoby być użyte w tym samym "kontekście". –

+0

Należy to porównać z innymi słowami kontekstowymi, takimi jak 'add' - w tym przypadku kompilator rzeczywiście wie, za każdym razem, czy słowo kluczowe jest przeznaczone (deklaracja zdarzenia, identyfikator nie ma tam żadnego sensu), czy kod odnosi się do identyfikator (typ lub nazwa w deklaracji, użycie identyfikatora w treści metody, słowo kluczowe nie miałoby sensu). –

8

W wersjach C# przed wersją 3, implicitly typed local variables nie były jeszcze obsługiwane, więc var nie miał specjalnego znaczenia i możliwe było zdefiniowanie zmiennych i klas o nazwie var. Twój przykładowy program jest legalny, ponieważ oba wystąpienia var w main odnoszą się do klasy var.

C# 3 i nowsze wersje są kompatybilne w dół, więc kod napisany w języku C# przed wersją 3 nadal kompiluje się z nowymi kompilatorami.

int i true to słowa kluczowe, ponieważ C# 1.

12

inny sposób patrzenia na to: „var” jako słowo kluczowe nie było w pierwszych wersjach C# (w przeciwieństwie do „int” i „prawda”), tak być może napisałeś kod, który miał klasę o nazwie "var". To było całkowicie w porządku i legalne. Później, gdy do języka dodano "var", projektanci byli tak mili, że są słowem kluczowym tylko w pewnych kontekstach, więc twoja istniejąca klasa var nadal by działała.

Jest to jedno z prawdziwych wyzwań związanych z projektowaniem języka - jak dodawać nowe funkcje bez łamania istniejącego kodu i bez konieczności wprowadzania nowych funkcji.

3

Słowa kluczowe można rezerwować w kontekście. Podczas analizowania kodu źródłowego ten kontekst jest tworzony jako część drzewa analizy. Ocena słów kluczowych odbywa się w tym kontekście. Tak więc w tym przypadku var nie jest w zarezerwowanym kontekście i nie ma takiego samego znaczenia, jak w przypadku użycia go w instrukcji przypisania. Sądzę, że jedną z przyczyn tej elastyczności jest to, że var został wprowadzony w C# 3, więc uczynienie go zarezerwowanym wszędzie mogłoby złamać kompatybilność wsteczną w niektórych programach, podczas gdy użycie go jako deklaracji typu zmiennej nie skompilowałoby się we wcześniejszych wersjach, więc nie ma złamanie.

Powiązane problemy