2016-01-18 10 views
5

Sto usando cose come $"hello {person}" e nameof(arg1) nel mio codice, ma sul controllo delle proprietà del progetto sto cercando .NET 4.5.Utilizzo di interpolazione di stringhe e nome in .VS 2015 NET 4.5

Va bene? Pensavo che queste cose fossero state introdotte in 4.6.

Il progetto è stato creato e funziona correttamente sulla mia macchina, ma temo che qualcosa vada storto quando lo distribuisco.

+0

Vedere [Untangling the Versions] (http://csharpindepth.com/Articles/Chapter1/Versions.aspx) di Jon Skeet. Anche se non copre C# 6.0 ma il concetto è lo stesso. – Habib

risposta

11

È una funzione del compilatore, non una funzione di framework. Usiamo con successo entrambe le funzioni con i nostri progetti .NET 3.5 in Visual Studio 2015.

In poche parole, il compilatore traduce $"hello {person}"-String.Format("hello {0}", person) e nameof(arg1) a "arg1". È solo zucchero sintattico.

Il runtime vede una chiamata String.Format (o una stringa letterale "arg1", rispettivamente) e non sa (né cura) quale sia il codice sorgente originale. String.Format è supportato sin dai primi giorni di .NET Framework, quindi non c'è nulla che ti impedisca di scegliere come target una versione precedente del framework.

+1

Vedere la mia risposta per una leggera ruga su questo intorno a 'FormattableString'. –

1

Queste cose sono state introdotte in C#6. .Net non ha niente a che fare con questo. Quindi, se utilizzi un compilatore C# 6, puoi utilizzare queste funzioni.

What is the difference between C# and .NET?

Quindi sì, va bene di utilizzarli in un progetto di mira .Net 4.5.

8

Le risposte esistenti parlano di questa funzione C# 6 senza un componente .NET Framework.

Questo è interamente vero per nameof - ma solo un po ' true di interpolazione stringa.

String interpolazione utilizzerà string.Format nella maggior parte dei casi, ma se si sta utilizzando .NET 4.6, può anche convertire una stringa interpolato in una FormattableString, che è utile se si desidera la formattazione invariante:

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

Ovviamente questo non funzionerebbe se semplicemente invocato una chiamata a string.Format ... invece, in questo caso si chiama string.Format nella dichiarazione assegnando a local e chiede FormattableStringFactory.Create nella dichiarazione assegnando a invariant e chiede FormattableString.Invariant sul risultato. Se si tenta di compilarlo con una versione precedente del framework, FormattableString non esiste, quindi non verrà compilato. È possibile fornire la propria implementazione di FormattableString e FormattableStringFactory se si desidera, tuttavia, e il compilatore li utilizzerà in modo appropriato.

Problemi correlati