Здесь задействовано несколько разных версий:
- IDE: Visual Studio 2008
- .NET Framework: вы ориентируетесь на .NET 2.0
- CLR: вы нацеливаетесь на 2.0 (игнорируя пакеты обновления:)
- Используемый вами компилятор C #: Visual Studio 2008 всегда использует компилятор C # 3.0
- Языковая версия, на которую ориентирован компилятор: по умолчанию 3.0
Чтобы вывести вывод из строя, не возвращаясь к компилятору версии 2.0, вам нужно заставить компилятор C # использовать версию 2 языка. Я не знаю, предоставляет ли это экспресс-выпуск Visual Studio, но вы можете использовать командную строку, чтобы увидеть это.
К сожалению - а это действительно странно - я теперь тоже не могу воспроизвести сложность таким образом.
Вот что я только что попробовал:
using System;
class Test
{
public delegate T Function<T>();
public static T Execute<T>(Function<T> function)
{
return function();
}
static void Main()
{
Execute(delegate { return 5; });
}
}
Я ожидал, что компиляция с
csc /langversion:ISO-2 Test.cs
потерпит неудачу ... но это не так. Это терпит неудачу с реальным компилятором C # 2:
>c:\Windows\Microsoft.NET\Framework\v2.0.50727\csc Test.cs
Microsoft (R) Visual C# 2005 Compiler version 8.00.50727.3053
for Microsoft (R) Windows (R) 2005 Framework version 2.0.50727
Copyright (C) Microsoft Corporation 2001-2005. All rights reserved.
Test.cs(14,9): error CS0411: The type arguments for method
'Test.Execute<T>(Test.Function<T>)' cannot be
inferred from the usage. Try specifying the type
arguments explicitly.