Possible breaking change in MVC4 Razor that can be fixed with "@:@"

asp.net-mvc-3, asp.net-mvc-4, razor, razor-2

Solution

Seems like a bug. It works with `String`:

@foreach (var x in Model)
{
    @String.Format("Foo bar: {0}", x)
}

Problem

I recently upgraded my website from ASP.NET MVC3 (Razor) to MVC4 (Razor2), and in doing so found what seemed like a breaking change in the Razor view engine. The scenario (greatly simplified) is shown below. ``` @model IEnumerable<string> @{ Layout = null; } <!DOCTYPE html> <html> <body> <div> @foreach (var x in Model) { @string.Format("Foo bar: {0}", x) // Errors in MVC4/Razor2 } </div> </body> </html> ``` This works fine in MVC3/Razor, however in MVC4/Razor2 the `string.Format` line results in an error of: Unexpected "string" keyword after "@" character. Once inside code, you do not need to prefix constructs like "string" with "@". If you remove the `@`, the view engine then demands that you terminate the `string.Format` line with a semicolon. However, ReSharper then warns (rightly so): Return value of pure method is not used. The two fixes I've found for this are either to use `<text>`: ``` <text>@string.Format("The value {0}", x)</text> ``` Or a more curious approach using `@:@`: ``` @:@string.Format("The value {0}", x) ``` Is this a known and documented change in the Razor view engine?

Original source