Работает ли С# 6.0 на .NET 4.0?

Я создал образец проекта, в качестве примера которого были использованы свойства С# 6.0 - нулевое распространение и инициализация свойств, установите целевую версию .NET 4.0 и он... работает.

public class Cat
{
    public int TailLength { get; set; } = 4;

    public Cat Friend { get; set; }

    public string Mew() { return "Mew!"; }
}

class Program
{
    static void Main(string[] args)
    {
        var cat = new Cat {Friend = new Cat()};
        Console.WriteLine(cat?.Friend.Mew());
        Console.WriteLine(cat?.Friend?.Friend?.Mew() ?? "Null");
        Console.WriteLine(cat?.Friend?.Friend?.TailLength ?? 0);
    }
}

Означает ли это, что я могу использовать функции С# 6.0 для своего программного обеспечения, предназначенного для .NET 4.0? Существуют ли какие-либо ограничения или недостатки?

Ответ 1

Да (в основном). Для С# 6.0 требуется новый компилятор Roslyn, но новый компилятор может скомпилировать таргетинг на более ранние версии. Это ограничивается только новыми функциями, которые не требуют поддержки из фреймворка.

Например, если вы можете использовать функцию интерполяции строк в С# 6.0 с более ранними версиями .Net(поскольку это приводит к вызову string.Format):

int i = 3;
string s = $"{i}";

Вам нужно .Net 4.6 использовать его с IFormattable, поскольку только новая версия фреймворка добавляет System.FormattableString:

int i = 3;
IFormattable s = $"{i}";

В случаях, о которых вы упомянули, не нужны типы из рамки для работы. Таким образом, компилятор полностью поддерживает эти функции для старых версий рамок.

Ответ 2

Просто хочу сосредоточиться на том, как понимать Википедию и другие ссылки.

Когда Wikipedia говорит, что С# 6.0 имеет .NET Framework 4.6, это просто означает, что производственная версия компилятора (msc.exe) будет частью выпуска .NET Framework 4.6. Через multi-targeting такие компиляторы могут поддерживать более низкие версии выпусков .NET Framework. Конечно, поскольку Roslyn стал проектом с открытым исходным кодом, компилятор теперь полностью является отдельным компонентом.

Когда что-то относится к версии CLR 4.0.30319 (.0), на самом деле это может быть .NET Framework 4. * (4.0, 4.0. *, 4.5, 4.5. *, 4.6, 4.6. *), поскольку они все реализуют спецификацию CLR версии 4. Не говоря уже о том, что Xamarin/Mono также реализует ту же спецификацию CLR.

Страница MSDN еще не полностью обновлена, но некоторая страница уже имеет .NET Framework 4.6, указанный в разделе Информация о версии.

В целом, спецификации языка (а также компилятор С#), спецификации CLR и выпуски .NET Framework не тесно связаны друг с другом. Это дает разработчикам достаточно гибкости для использования новых компиляторов для целевых старых CLR и .NET Framework.

Ответ 3

Да, вы можете использовать более новые компиляторы для старых фреймворков и получить доступ к новым функциям компилятора (пока эти функции не требуют новых типов, внедренных в .NET 4.6).

Другими примерами этого являются методы с параметрами по умолчанию, введенные с помощью С# 4.0 (.NET 4.0), но вы можете использовать их в проектах .NET 2.0 (С# 2.0) и .NET 3.5 (С# 3.0).

Вы также можете использовать методы расширения (введенные в С# 3.0) в .NET 2.0 или .NET 3.0 если вы сделаете одно небольшое обходное решение, чтобы сделать компилятор счастливым поэтому он может найти атрибут, который был введен в .NET 3.5.

Ответ 4

Если вы используете скрипты здания, не забудьте изменить путь к новому строителю:

установить CPATH = C:\Program Files (x86)\MSBuild\14.0\Bin

[Rebuild.bat]

set CPATH=C:\Program Files (x86)\MSBuild\14.0\Bin
call nuget_restore.bat
"%CPATH%\msbuild" YourSolution.sln /t:Rebuild /p:Configuration=Release /fileLogger /flp:logfile=JustErrors.log;errorsonly /verbosity:minimal

if %errorlevel% neq 0 goto ERROR

REM call deploy Release  //Things like deploy files..
goto END

:ERROR
       echo ERROR: %errorlevel%
       pause

:END