2016-01-18 20 views
5

Kodumda $"hello {person}" ve nameof(arg1) gibi şeyler kullanıyorum, ancak proje özelliklerini denetlerken .NET 4.5'ü hedefliyorum.Dize enterpolasyonunu ve adlarını kullanarak .VS 2015 NET 4.5

Bu tamam mı? Bu şeylerin 4.6'da tanıtıldığını düşündüm.

Proje, makinemde oluşturulup çalıştırılmaya devam ediyor - ama konuştuğumda bir şeylerin yanlış gitmesinden endişeleniyorum.

+0

Jon Skeet tarafından bkz. [Sürümlerin Untangling'i] (http://csharpindepth.com/Articles/Chapter1/Versions.aspx). Her ne kadar C# 6.0 kapsamaz ama kavram aynıdır. – Habib

cevap

11

Bir derleyici özelliği, bir çerçeve özelliği değil. Biz başarıyla Özetle Visual Studio 2015

bizim .NET 3.5 projelerle hem özelliklerini kullanmak, derleyici String.Format("hello {0}", person) için $"hello {person}" ve "arg1" için nameof(arg1) çevirir. Sadece sözdizimsel şeker.

Çalışma zamanı, bir String.Format çağrısı görür (veya sırasıyla bir dize değişmezi "arg1") ve orijinal kaynak kodunun neye benzediğini (veya bakımını) bilmez. .NET Framework'ün ilk günlerinden beri String.Format desteklenmektedir, bu nedenle, çerçevenin önceki bir sürümünü hedeflemenizi engelleyen hiçbir şey yoktur.

+1

Buradaki “FormattableString” etrafında hafif bir kırışıklık için cevabımı görün. –

1

Bunlar, C#6 adresinde sunulmuştur. .Net'un bununla hiçbir ilgisi yoktur. Bu nedenle, C# 6 derleyici'u kullandığınız sürece, bu özellikleri kullanabilirsiniz.

What is the difference between C# and .NET?

Yani evet, o .NET 4.5 hedefleyen bir projede bunları kullanmak tamamdır.

8

Varolan yanıtlar, .NET framework bileşeni olmayan bir C# 6 özelliği hakkında konuşuyor.

Bu, nameof için geçerlidir, ancak yalnızca biraz, dize enterpolasyonu için doğrudur.

dize enterpolasyon çoğu durumda string.Format kullanacaktır, ancak .NET 4.6 kullanıyorsanız eğer değişmez biçimlendirme istiyorsanız, da yararlı bir FormattableString, içine bir interpolated dizeyi dönüştürebilirsiniz:

using System; 
using System.Globalization; 
using static System.FormattableString; 

class Test 
{ 
    static void Main() 
    { 
     CultureInfo.CurrentCulture = CultureInfo.CreateSpecificCulture("fr-FR"); 
     double d = 0.5; 
     string local = $"{d}"; 
     string invariant = Invariant($"{d}"); 
     Console.WriteLine(local);  // 0,5 
     Console.WriteLine(invariant); // 0.5 
    }  
} 
basitçe string.Format bir çağrı çağrılan eğer

Açıkçası bu yerine ... işe yaramaz, bu durumda local için atama açıklamada string.Format çağırır ve invariant için atama açıklamada FormattableStringFactory.Create çağırır ve üzerinde FormattableString.Invariant çağırır sonuç. Bunu, çerçevenin önceki bir sürümüyle derlemeyi denerseniz, FormattableString bulunmayacak ve bu yüzden derlenmeyecektir. Gerçekten isterseniz, FormattableString ve FormattableStringFactory kendi uygulamanızı sağlayabilirsiniz ve derleyici bunları uygun şekilde kullanacaktır.

İlgili konular