Ответ 1
Вы не можете сказать ему, чтобы использовать компилятор С# 2, но вы можете сказать ему, чтобы он ограничивался языком С# 2.
В свойствах проекта перейдите на вкладку "Сборка", нажмите кнопку "Дополнительно..." в правом нижнем углу, и там есть вариант языковой версии... вы хотите ISO-2.
Обратите внимание, что это не идеально - он останавливает вас, используя большинство функций, отличных от С# -2, но некоторые изменения все равно могут пройти. Например, я считаю, что он по-прежнему будет использовать более мощный общий вывод типа, доступный на С# 3, чем версия С# 2. Стоит быть осторожным в этом. Вот пример:
using System;
class Test
{
static void Main()
{
Foo("hello", new object());
}
static void Foo<T>(T first, T second)
{
}
}
Компилятор С# 2 не может решить, что использовать для T
в вызове Foo
, потому что каждый аргумент используется полностью отдельно для определения вывода типа, а любые противоречивые результаты дают ошибку времени компиляции. С# 3 использует каждый аргумент, чтобы добавить ограничения на то, что может быть T
, и дает только ошибку, если конфликты конфликтуют (или если параметр типа не может быть определен). Компилятор С# 3 при вызове в режиме С# 2 по-прежнему использует поведение С# 3.
Есть ли причина, по которой вы не можете переключить свою фактическую сборку, чтобы использовать компилятор .NET 3.5 (С# 3)? Нет необходимости привязывать себя к С# 2 только потому, что вы используете .NET 2. Heck, LINQBridge вы можете даже использовать LINQ для объектов:)