23

I was using ReSharper plugin on VS2010 and i was generating an interface method. ReSharper put an @ on the parameter name. WHat is that used for?

int Count(Func<ContratoList, bool> @where);

Whats the difference for

int Count(Func<ContratoList, bool> where);

Thanks!

Jon Egerton
  • 40,401
  • 11
  • 97
  • 129
renanleandrof
  • 6,699
  • 9
  • 45
  • 67
  • Look at this posting about the `@` verbatim operator http://sanity-free.org/112/all_about_the_sign_csharp_verbatim_identifier.html – John Alexiou Nov 08 '11 at 19:38

6 Answers6

41

The @ symbol allows you to use reserved words in a variable name.

int @class = 1;

void MyMethod(int @goto);

bool @public { get; set; }

As Marc correctly pointed out in his comment and his answer, ReSharper is actually wrong to do this because where is a Contextual Keyword and is not actually a reserved word, so your method will compile without the @.

Connell
  • 13,925
  • 11
  • 59
  • 92
  • 10
    `where` ***is explicitly not*** a *reserved* keyword; it is a *contextual* keyword. This means that in effect, the `@where` in the question achieves: exactly nothing. – Marc Gravell Nov 08 '11 at 14:09
  • Yeah, you're right. It does say that in the link I included in the answer, but I assumed it to be the same with `where` because of the question. I've upvoted your answer though, well spotted! – Connell Nov 08 '11 at 14:14
  • 1
    Resharper is overzealous with adding @ to things. – Ritch Melton Nov 08 '11 at 16:50
26

In many ways, resharper is wrong to do this. where is a contextual keyword, meaning: it only acts as a keyword in some very specific scenarios (i.e. LINQ). In the position indicated, it actually does nothing. It would not be confused as a keyword there, as when the C# language designers add keywords to C# they need to ensure pre-existing code continues to compile (as far as possible), and that would have been legal in earlier C#.

The usage of @ also confuses/complicates some tools (razor, in particular, since razor already uses @ to indicate the start of code - meaning that for a variable using @ (i.e. @string) sometimes you need @ and sometimes you need @@ - and I know of at least one false-positive IDE warning this can cause).

However! If the parameter was if or class etc, then @if / @class allows you to use that as a variable name rather than getting confused as a C# keyword. That also isn't a great idea, note. But by the same token, we wouldn't start doing that to all our code (string @name = ... etc) - so why do it here? It isn't needed, and as demonstrated by this question, it has added confusion.

Personally, though, I'd find a parameter name that isn't a keyword or contextual-keyword.

Marc Gravell
  • 1,026,079
  • 266
  • 2,566
  • 2,900
  • 4
    It may also be worth adding that `where` is not only a LINQ keyword, but also used for generic type constraints – Connell Nov 08 '11 at 14:53
  • Yes, designers are trying to ensure that existing code doesn't break as far as possible. However, I was quite surprised when one Monday morning the module that no one touched for a couple of months suddenly refused to build. Turns out, it used `async` as a method parameter name. Morale: don't install Async CTP before going on week end – Dyppl Nov 09 '11 at 06:49
4

It allows you to use reserved keywords as variable names.

JoDG
  • 1,326
  • 8
  • 18
4

It will stop this parameter acting like a keyword (as whereis a keyword in linq amongst other things).

Jon Egerton
  • 40,401
  • 11
  • 97
  • 129
3

This is done because 'where' is a protected keyword in C# (LINQ)

GeirGrusom
  • 999
  • 5
  • 18
1

it allows you to use reserved words as params.

Royi Namir
  • 144,742
  • 138
  • 468
  • 792