2013-02-12 5 views
7

pierwsze, to nie jest powielanie What does the @ symbol before a variable name mean in C#?co znaczy @ przed variabe w C#?

jak group nie jest zachowana słów kluczowych.

Napisałem trochę kodu, a resharper zaproponował mi dodanie @ przed zmienną group.

Każdy pomysł, dlaczego?

var group = GetDefaultGroup(ClientServiceCommon.Poco.Group); 

filteredPairs = @group.Pairs.ToList(); 
+1

Tak, to pozwala na użycie Zarezerwowane (nie zachował się) słowa kluczowego , ale jest także dozwolone przed _any_ nazwą zmiennej. Dlaczego resharper sugeruje to, jest inne pytanie, chociaż klauzula LINQ [grupa] (http://msdn.microsoft.com/en-us/library/bb384063.aspx) jest dobrym kandydatem. – Oded

+4

'group' jest kontekstowym słowem kluczowym w języku C#. Zobacz [MSDN] (http://msdn.microsoft.com/en-us/library/x53a06bb.aspx) –

+1

'z grupy w grupie grupy filtersPairs według grupy. Something' –

Odpowiedz

12

Jak prawidłowo podkreślić, group nie jest zarezerwowanym kluczowe (język projektanci starają się nie wprowadzać nowych zastrzeżonych słów kluczowych, gdy dodać nowe funkcje do języka, aby nie złamać istniejących programów). Jest to jednak słowo kluczowe: staje się słowem kluczowym w wyrażeniach zapytań LINQ. Resharper sugeruje zmianę nazwy danej zmiennej, aby uniknąć niejednoznaczności, które wynikłyby, gdyby ta zmienna była używana w wyrażeniach zapytań.

Z language specification:

7.16.1 Ambiguities in query expressions

Query expressions contain a number of “contextual keywords”, i.e., identifiers that have special meaning in a given context. Specifically these are from, where, join, on, equals, into, let, orderby, ascending, descending, select, group and by. In order to avoid ambiguities in query expressions caused by mixed use of these identifiers as keywords or simple names, these identifiers are considered keywords when occurring anywhere within a query expression. For this purpose, a query expression is any expression that starts with “from identifier” followed by any token except “;”, “=” or “,”.

Jeśli próbował wykonać następujące czynności, co można uzyskać błąd kompilatora:

var filteredParis = from pair in group.Pairs // group is now treated as a keyword 
        select pair;