2016-01-18 26 views
5

Używam w moim kodzie rzeczy takich jak $"hello {person}" i nameof(arg1), ale po sprawdzeniu właściwości projektu wybieram .NET 4.5.Używanie interpolacji ciągów znaków i nazw w .VS 2015 NET 4.5

Czy to w porządku? Myślałem, że te rzeczy zostały wprowadzone w 4.6.

Projekt jest zbudowany i działa poprawnie na moim komputerze - ale obawiam się, że coś się nie powiedzie, gdy go wdrożę.

+0

Zobacz [Rozplątanie wersji] (http://csharpindepth.com/Articles/Chapter1/Versions.aspx) autorstwa Jona Skeeta. Chociaż nie obejmuje C# 6.0, ale koncepcja jest taka sama. – Habib

Odpowiedz

11

Jest to funkcja kompilatora, a nie funkcja ramowa. Z powodzeniem używać zarówno funkcje z naszych projektów .NET 3.5 w Visual Studio 2015.

W skrócie, kompilator tłumaczy $"hello {person}" do String.Format("hello {0}", person) i nameof(arg1) do "arg1". To tylko cukier syntaktyczny.

Środowisko wykonawcze odczytuje wywołanie String.Format (lub literał łańcuchowy "arg1") i nie wie (ani nie obchodzi), jak wyglądał oryginalny kod źródłowy. String.Format jest obsługiwany od wczesnych dni .NET Framework, więc nie ma nic, co uniemożliwiłoby Ci kierowanie na wcześniejszą wersję struktury.

+1

Zobacz odpowiedź na nieznaczne zmarszczki na temat 'FormattableString'. –

1

Te rzeczy zostały wprowadzone w C#6. .Net nie ma z tym nic wspólnego. Tak długo, jak korzystasz z kompilatora C# 6 , możesz korzystać z tych funkcji.

What is the difference between C# and .NET?

Więc tak, to jest w porządku je wykorzystać w projekcie kierowania .Net 4.5.

8

Istniejące odpowiedzi mówią o tym, że jest to funkcja C# 6 bez składnika .NET.

To jest całkowicie prawdziwe z nameof - ale tylko w pewnym stopniu prawdziwe z interpolacji ciągów.

interpolacja String użyje string.Format w większości przypadków, ale jeśli używasz .NET 4.6, można również przekonwertować ciąg interpolowana do FormattableString, co jest przydatne, jeśli chcesz formatowanie niezmienny:

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

Oczywiście to nie będzie działać, jeśli prostu wywoływana wywołanie string.Format ... zamiast, w tym przypadku nazywa to string.Format w rachunku przypisanie local i wzywa FormattableStringFactory.Create w rachunku przypisanie invariant i wzywa FormattableString.Invariant na wynik. Jeśli spróbujesz skompilować to z wcześniejszą wersją frameworka, FormattableString nie będzie istnieć, więc nie będzie się kompilować. Możesz jednak wprowadzić własną implementację FormattableString i FormattableStringFactory, jeśli naprawdę tego chcesz, a kompilator użyje ich odpowiednio.