Czy var
słowo kluczowe nie jest w języku C #? Ale dlaczego mogę to zrobić:
public class var { }
public class main
{
public static void main(string[] args)
{
var testVar = new var();
}
}
To, var
co jest używane w kodzie, to var
klasa zadeklarowana przed main
klasą. A kompilator nawet nie narzeka.
Kiedy to robię:
public class int { }
albo to:
public class true { }
Kompilator powiedział, że int
lub true
jest słowem kluczowym i nie może być używany w ten sposób. Dlaczego to nie to samo z var
?
var var = "var";
w metodzie. W końcu jest piątek.Odpowiedzi:
var
nie jest słowem kluczowym na tej liście .jest to kontekstowe słowo kluczowe, więc na podstawie kontekstu kompilator jest w stanie zdecydować, która klasa jest twoją, a która jest kontekstowym słowem kluczowym, i nie powstaje żadne zamieszanie.
kontekstowe słowo kluczowe to:
więc nie jest zarezerwowany, możesz go używać.
Jak wskazano w komentarzach powyżej, znajduje się omówienie różnic, a także lista różnych słów kluczowych i kontekstowych słów kluczowych dodanych w każdej wersji języka c # na blogu Erica Lippertsa
Warto zauważyć, że od kiedy ustalono zestaw słów kluczowych w C # 1.0, nie było żadnych dodatków, aby zachować zgodność wsteczną.
źródło
Contextual Keyword
. „Kontekstowe słowo kluczowe jest używane w celu nadania określonego znaczenia w kodzie, ale nie jest to słowo zastrzeżone w języku C # . Niektóre kontekstowe słowa kluczowe, takie jak częściowe i gdzie, mają specjalne znaczenie w dwóch lub więcej kontekstach”.var
to nie wszystko psuje się podczas uaktualniania C #.Kompilator jest wystarczająco inteligentny, aby wiedzieć, że kontekst, którego używasz
var
jako nazwy klasy, nigdy nie jest kontekstem dla słowa kluczowego, więc pozwala na to (dlatego jest definiowany jako kontekstowe słowo kluczowe ).źródło
var
jest używany jako słowo kluczowe w kodzie takim jakvar testVar = new var();
. Tak, kontekst, pod względem tego, czyvar
zdefiniowano niestandardowy typ , gra w nim, ale to właśnie dlatego, że kompilator nie jest wystarczająco inteligentny w tych przypadkach, aby wiedzieć, czyvar testVar
odnosi się do klasy,var
czy do słowa kluczowego,var
które domyślnie odnosi się do klasy w takim kontekście. Gdybyvar
słowo kluczowe zostało nazwane inaczej, mogłoby być używane w tym samym „kontekście”.add
- tutaj kompilator rzeczywiście wie w każdym przypadku, czy chodzi o słowo kluczowe (deklaracja zdarzenia; identyfikator nie miałby tam żadnego sensu), czy też kod odwołuje się do identyfikatora (typu lub nazwa w deklaracji, użycie identyfikatora w treści metody; słowo kluczowe nie miałoby tam żadnego sensu).Patrząc na to inaczej: „var” jako słowo kluczowe nie występowało w pierwszych wersjach C # (w przeciwieństwie do „int” i „true”), więc być może napisałeś wtedy jakiś kod, który miał klasę o nazwie „var”. To było w porządku i legalne. Później, kiedy "var" zostało dodane do języka, projektanci byli tak uprzejmi, że uczyniły go słowem kluczowym tylko w określonych kontekstach, więc twoja istniejąca klasa var nadal działała.
Jest to jedno z prawdziwych wyzwań projektowania języka - jak dodawać nowe funkcje bez łamania istniejącego kodu i nie utrudniając korzystania z nowych funkcji.
źródło
W wersjach C # przed wersją 3 niejawnie wpisane zmienne lokalne nie były jeszcze obsługiwane, więc
var
nie miały specjalnego znaczenia i można było zdefiniować zmienne i klasy o nazwachvar
. Twój przykładowy program jest legalny, ponieważ obydwa występującevar
wmain
którym mowa klasyvar
.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
itrue
są słowami kluczowymi od C # 1.źródło
Słowa kluczowe można zarezerwować kontekstowo. Kiedy kod źródłowy jest analizowany, kontekst ten jest ustanawiany jako część drzewa analizy. Ocena słów kluczowych odbywa się w tym kontekście. Tak więc w tym przypadku zmienna nie znajduje się w zarezerwowanym kontekście i nie będzie miała takiego samego znaczenia, jak wtedy, gdy używasz jej w instrukcji przypisania. Uważam, że jednym z powodów tej elastyczności jest to, że var został wprowadzony w C # 3, więc zarezerwowanie go wszędzie mogłoby zepsuć wsteczną kompatybilność w niektórych programach, podczas gdy użycie go jako deklaracji typu zmiennej nie byłoby kompilowane we wcześniejszych wersjach, więc nie ma złamanie.
źródło