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);
}
}
- Wikipedia mengatakan .NET framework untuk C # 6.0 adalah 4.6.
- Pertanyaan ini (dan tes CTP Visual Studio 2015 ) mengatakan versi CLR adalah 4.0.30319.0.
- Halaman MSDN ini mengatakan bahwa .NET 4, 4.5, 4.5.2 menggunakan CLR 4. Tidak ada informasi tentang .NET 4.6.
Apakah itu berarti saya dapat menggunakan fitur C # 6.0 untuk perangkat lunak saya yang menargetkan .NET 4.0? Apakah ada batasan atau kekurangan?
Jawaban:
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
):Anda perlu. Net 4.6 untuk menggunakannya dengan
IFormattable
hanya menambahkan versi kerangka kerja baruSystem.FormattableString
: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.
sumber
IFormattable
interpolasi string.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.
sumber
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.
sumber
Jika Anda menggunakan skrip bangunan ingatlah untuk mengubah path ke builder baru:
atur CPATH = C: \ Program Files (x86) \ MSBuild \ 14.0 \ Bin
[Rebuild.bat]
sumber
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 .
sumber