Apakah C # 6.0 berfungsi untuk .NET 4.0?

275

Saya membuat proyek sampel, dengan C # 6.0 barang - propagasi nol dan inisialisasi properti sebagai contoh, menetapkan versi target .NET 4.0 dan itu ... berfungsi.

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);
    }
}

Apakah itu berarti saya dapat menggunakan fitur C # 6.0 untuk perangkat lunak saya yang menargetkan .NET 4.0? Apakah ada batasan atau kekurangan?

MajesticRa
sumber
7
.Net versi 2.0 - 3.5 menggunakan CLR v2.0. Versi yang lebih baru menggunakan CLR v4.0.
i3arnon
perlu diingat bahwa, optimalkan bijak: Anda menambahkan tanda-jika-nol-terpisah untuk setiap kucing seperti ini
Terence
2
Ya ampun. Saya telah mengembangkan penargetan WCF v4.6 hanya untuk "diingatkan" bahwa server produksi tidak akan ditingkatkan hingga 2018. Saya pikir pekerjaan satu bulan akan memerlukan beberapa hari refactoring. Selesai dalam lima menit. Terima kasih, Microsoft! : D
Eric Wu

Jawaban:

286

Ya (kebanyakan) C # 6.0 memerlukan kompiler Roslyn baru, tetapi kompiler baru dapat mengkompilasi penargetan versi kerangka kerja yang lebih lama. Itu hanya terbatas pada fitur-fitur baru yang tidak memerlukan dukungan dari framework .

Misalnya, saat Anda dapat menggunakan fitur interpolasi string di C # 6.0 dengan versi .Net yang lebih lama (karena menghasilkan panggilan ke string.Format):

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

Anda perlu. Net 4.6 untuk menggunakannya dengan IFormattablehanya menambahkan versi kerangka kerja baru System.FormattableString:

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

Kasing yang Anda sebutkan tidak perlu jenis dari kerangka kerja untuk bekerja. Jadi kompiler sepenuhnya mampu mendukung fitur-fitur ini untuk versi kerangka kerja lama.

i3arnon
sumber
31
Sebenarnya, Anda tidak perlu. Net 4.6, hanya beberapa jenis yang ditambahkan di dalamnya. Anda bisa menambahkannya sendiri ke kerangka kerja yang lebih lama. Kode ini berfungsi dengan baik di .Net 4.0 dan 3.5.
svick
10
Apakah ada daftar di suatu tempat untuk melihat fitur C # 6 mana yang bekerja di .NET 4.0? Cara lain untuk menanyakan hal ini adalah: fitur baru mana yang membutuhkan dukungan dari framework dan mana yang tidak?
Rubenisme
1
@ Rubenisme Saya tidak bisa memikirkan yang lain selain IFormattableinterpolasi string.
i3arnon
2
Saya kira kita bisa mengatakan semua gula sintaksis dapat digunakan dan ditargetkan ke versi kerangka kerja yang lebih lama. apakah boleh mengatakan itu?
mkb
4
@ MBk ya. Gula sintaksis adalah fitur yang hanya mengandalkan kemampuan kompiler dan bukan yang framework.
i3arnon
52

Hanya ingin fokus pada cara memahami Wikipedia dan tautan lain.

Ketika Wikipedia mengatakan C # 6.0 dengan .NET Framework 4.6, itu berarti versi produksi dari kompiler (msc.exe) akan menjadi bagian dari rilis .NET Framework 4.6. Melalui multi-penargetan , kompiler semacam itu dapat mendukung versi yang lebih rendah dari rilis .NET Framework. Tentu saja, karena Roslyn menjadi proyek open source, kompiler sekarang sepenuhnya merupakan komponen individu.

Ketika sesuatu merujuk versi CLR 4.0.30319 (.0), itu sebenarnya bisa .NET Framework 4. * (4.0, 4.0. *, 4.5, 4.5. *, 4.6, 4.6. *), Karena mereka semua mengimplementasikan Spesifikasi versi 4 CLR. Belum lagi Xamarin / Mono juga menerapkan spesifikasi CLR yang sama.

Halaman MSDN belum sepenuhnya diperbarui, tetapi beberapa halaman sudah memiliki .NET Framework 4.6 terdaftar di bagian Informasi Versi.

Secara umum, spesifikasi bahasa (serta kompiler C #), spesifikasi CLR, dan rilis .NET Framework tidak saling terkait satu sama lain. Itu memberi pengembang cukup fleksibilitas untuk menggunakan kompiler baru untuk menargetkan CLR dan .NET Frameworks yang lebih lama.

Lex Li
sumber
29

Ya, Anda bisa menggunakan kompiler yang lebih baru untuk kerangka kerja yang lebih lama dan mendapatkan akses ke fitur kompiler baru (selama fitur-fitur itu tidak memerlukan tipe baru yang diperkenalkan di .NET 4.6).

Contoh lain dari ini adalah metode dengan parameter default diperkenalkan dengan C # 4.0 (.NET 4.0) tetapi Anda dapat menggunakannya dalam proyek .NET 2.0 (C # 2.0) dan .NET 3.5 (C # 3.0).

Anda juga dapat menggunakan Metode Ekstensi (diperkenalkan dalam C # 3.0) di .NET 2.0 atau .NET 3.0 jika Anda melakukan satu solusi kecil untuk membuat kompiler senang sehingga dapat menemukan atribut yang diperkenalkan di .NET 3.5.

Scott Chamberlain
sumber
1

Jika Anda menggunakan skrip bangunan ingatlah untuk mengubah path ke builder baru:

atur 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
oobe
sumber
1

Jawaban oleh @oobe sebenarnya importatnt. Saya bisa membangun solusi saya melalui file batch hanya setelah menggunakan MSBuild.exe dari C: \ Program Files (x86) \ MSBuild \ 14.0 \ Bin .

Suryakant Soni
sumber