C # 6.0 .NET 4.0 için çalışır mı?


275

Örnek bir proje, C # 6.0 hediyeler - boş yayılma ve özellikleri başlatma ile örnek olarak oluşturulan, hedef sürüm .NET 4.0 ayarlayın ve ... çalışır.

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

.NET 4.0'ı hedefleyen yazılımım için C # 6.0 özelliklerini kullanabileceğim anlamına mı geliyor? Herhangi bir sınırlama veya dezavantaj var mı?


7
Net sürüm 2.0 - 3.5 CLR v2.0 kullanır. Daha yeni sürümlerde CLR v4.0 kullanılır.
i3arnon

aklınızda bulundurun, akıllıca optimize edin: böyle her kedi için ayrı bir if-null-check ekliyorsunuz
Terence

2
Tanrım. Üretim sunucusunun 2018 yılına kadar yükseltilmeyeceğini "hatırlatmak" için v4.6'yı hedefleyen bir WCF geliştiriyorum. Bir aylık çalışmanın birkaç gün yeniden düzenleme gerektireceğini düşündüm. Beş dakika içinde tamamlandı. Teşekkürler Microsoft! : D
Eric Wu

Yanıtlar:


286

Evet (çoğunlukla). C # 6.0 yeni Roslyn derleyicisini gerektirir, ancak yeni derleyici eski çerçeve sürümlerini hedefleyerek derleyebilir. Bu sadece çerçeveden destek gerektirmeyen yeni özelliklerle sınırlıdır .

Örneğin, C # 6.0'daki dize enterpolasyon özelliğini .Net'in önceki sürümleriyle kullanabilirsiniz (çağrıyla sonuçlanır string.Format):

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

IFormattableYalnızca yeni çerçeve sürümü eklediği için .Net 4.6'ya ihtiyacınız var System.FormattableString:

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

Bahsettiğiniz vakaların çalışmak için çerçeveden türlere ihtiyacı yoktur. Böylece derleyici bu özellikleri eski çerçeve sürümleri için tamamen destekleyebilir.


31
Aslında .Net 4.6'ya ihtiyacınız yoktur, sadece birkaç tür eklenir. Bunları eski çerçevelere kendiniz ekleyebilirsiniz. Bu kod .Net 4.0 ve 3.5 üzerinde iyi çalışır.
svick

10
.NET 4.0'da hangi C # 6 özelliklerinin çalıştığını görmek için bir liste var mı? Bunu sormanın bir başka yolu şu olabilir: hangi yeni özellikler çerçeveden destek gerektirir ve hangileri istemez?
Rubenisme

1
@Rubenisme IFormattableDize enterpolasyonundan başka bir tane daha düşünemiyorum .
i3arnon

2
Sanırım tüm sözdizimsel şekerler kullanılabilir ve eski çerçeve sürümlerine hedeflenebilir. Bunu söylemek uygun mu?
mkb

4
@mkb evet. Sözdizimsel şeker, tam olarak çerçeve yeteneklerine değil, derleyici yeteneklerine dayanan özelliklerdir.
i3arnon

52

Sadece Wikipedia ve diğer bağlantıları nasıl anlayacağınıza odaklanmak istiyorum.

Wikipedia, C # 6.0'ın .NET Framework 4.6 ile birlikte olduğunu söylediğinde, derleyicinin (msc.exe) üretim sürümünün .NET Framework 4.6 sürümünün bir parçası olacağı anlamına gelir. Via çoklu hedefleme gibi derleyiciler .NET Framework bültenleri alt sürümlerini destekleyebilir. Tabii ki, Roslyn açık kaynaklı bir proje haline geldiğinden, derleyici artık tamamen bireysel bir bileşen.

Bir şey 4.0.30319 (.0) 'ın CLR sürümüne başvurduğunda, aslında .NET Framework 4. * (4.0, 4.0. *, 4.5, 4.5. *, 4.6, 4.6. *) Olabilir. CLR sürüm 4 özellikleri. Xamarin / Mono da aynı CLR spesifikasyonunu uygulamaktadır.

MSDN sayfası henüz tam olarak güncellenmemiştir, ancak bazı sayfalarda Sürüm Bilgileri bölümünde listelenen .NET Framework 4.6 vardır.

Genel olarak, dil özellikleri (C # derleyicisi gibi), CLR özellikleri ve .NET Framework sürümleri birbirleriyle sıkı sıkıya bağlı değildir. Geliştiricilere, eski CLR'leri ve .NET Framework'leri hedeflemek için yeni derleyiciler kullanmak için yeterli esneklik sağlar.


29

Evet, eski çerçeveler için daha yeni derleyicileri kullanabilir ve yeni derleyici özelliklerine erişebilirsiniz (bu özellikler .NET 4.6'da tanıtılan yeni türler gerektirmediği sürece).

Bunun diğer örnekleri, C # 4.0 (.NET 4.0) ile varsayılan parametrelere sahip yöntemlerdir, ancak bunları .NET 2.0 (C # 2.0) ve .NET 3.5 (C # 3.0) projelerinde kullanabilirsiniz.

Derleyiciyi .NET 3.5'te tanıtılan bir özniteliği bulabilmek için mutlu etmek için küçük bir geçici çözüm yaparsanız , .NET 2.0 veya .NET 3.0'da Uzantı Yöntemleri'ni (C # 3.0'da tanıtıldı) kullanabilirsiniz.


1

Bina komut dosyaları kullanıyorsanız, yeni oluşturucuya giden yolu değiştirmeyi unutmayın:

set CPATH = C: \ Program Dosyaları (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

1

Tarafından cevap @oobe aslında importatnt olduğunu. Ben sadece kullandıktan sonra bir toplu dosyası üzerinden benim çözüm inşa edebileceğini MSBuild.exe dan C: \ Program Files (x86) \ MSBuild \ 14.0 \ Bin .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.