2016-01-18 3 views
5

Ich verwende Dinge wie $"hello {person}" und nameof(arg1) in meinem Code, aber beim Überprüfen der Projekteigenschaften, die ich .NET 4.5.Verwenden von Zeichenfolge-Interpolation und Name von in .VS 2015 NET 4.5

Ist das okay? Ich dachte, diese Dinge wurden in 4.6 eingeführt.

Das Projekt wird auf meinem Computer ordnungsgemäß erstellt und ausgeführt, aber ich bin besorgt, dass bei der Bereitstellung etwas schief gehen wird.

+0

Siehe [Entwirren Sie die Versionen] (http://csharpindepth.com/Articles/Chapter1/Versions.aspx) von Jon Skeet. Es deckt zwar nicht C# 6.0 ab, aber das Konzept ist dasselbe. – Habib

Antwort

11

Es ist eine Compiler-Funktion, keine Framework-Funktion. Wir verwenden erfolgreich beide Funktionen mit unseren .NET 3.5-Projekte in Visual Studio 2015

Auf den Punkt gebracht, übersetzt der Compiler $"hello {person}"-String.Format("hello {0}", person) und nameof(arg1) zu "arg1". Es ist nur syntaktischer Zucker.

Die Laufzeit sieht einen String.Format Aufruf (oder ein String-Literal "arg1" bzw.) und weiß nicht (egal wie der ursprüngliche Quellcode sah). String.Format wird seit den Anfängen von .NET Framework unterstützt. Sie können also nicht an einer früheren Version des Frameworks teilnehmen.

+1

Siehe meine Antwort für eine leichte Faltenbildung um 'FormattableString'. –

1

Diese Dinge wurden in C#6 eingeführt. .Net hat damit nichts zu tun. Solange Sie einen C# 6 Compiler verwenden, können Sie diese Funktionen verwenden.

What is the difference between C# and .NET?

Also ja, ist es in Ordnung, sie in einem Projekt Targeting 4.5 .Net zu verwenden.

8

Die vorhandenen Antworten sprechen darüber, dass es sich um ein C# 6-Feature ohne eine .NET Framework-Komponente handelt.

Dies gilt vollständig für nameof - aber nur etwas wahr der String-Interpolation.

String Interpolation wird string.Format in den meisten Fällen verwenden, aber wenn Sie .NET 4.6 verwendet, kann es auch eine interpoliert String in eine FormattableString, konvertieren, die nützlich ist, wenn Sie invariant Formatierung wollen:

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

Offensichtlich würde dies nicht funktionieren, wenn einfach einen Aufruf an string.Format aufgerufen ... statt, in diesem Fall nennt es string.Format in der Erklärung zu local Zuordnung und fordert FormattableStringFactory.Create in der Erklärung zu invariant Zuordnung und fordert FormattableString.Invariant auf dem Ergebnis. Wenn Sie versuchen, dies mit einer früheren Version des Frameworks zu kompilieren, wird FormattableString nicht vorhanden sein, damit es nicht kompiliert wird. Sie können Ihre eigene Implementierung von FormattableString und FormattableStringFactory bereitstellen, wenn Sie wirklich möchten, und der Compiler wird sie entsprechend verwenden.

Verwandte Themen