2016-01-18 3 views
5

Я использую такие вещи, как и nameof(arg1) в моем коде, но при проверке свойств проекта я нацелен на .NET 4.5.Использование строковой интерполяции и nameof в .VS 2015 NET 4.5

Это нормально? Я думал, что эти вещи были введены в 4.6.

Проект строит и работает хорошо на моей машине - но я беспокоюсь, что что-то пойдет не так, когда я его развожу.

+0

См. [Распутывание версий] (http://csharpindepth.com/Articles/Chapter1/Versions.aspx) от Jon Skeet. Хотя он не распространяется на C# 6.0, но концепция такая же. – Habib

ответ

11

Это функция компилятора, а не функция фреймворка. Мы успешно использовать обе возможности с нашими .NET 3.5 проектов в Visual Studio 2015.

В двух словах, компилятор переводит $"hello {person}" к String.Format("hello {0}", person) и nameof(arg1) к "arg1". Это просто синтаксический сахар.

Среда выполнения видит вызов String.Format (или строковый литерал «arg1» соответственно) и не знает (и не заботится) о том, как выглядел исходный исходный код. String.Format поддерживается с первых дней работы .NET Framework, поэтому нет ничего, что помешало бы вам настроить таргетинг на более раннюю версию фреймворка.

+1

Посмотрите на мой ответ за небольшую морщину вокруг этого вопроса: 'FormattableString'. –

1

Эти вещи были представлены в C#6. .Net не имеет к этому никакого отношения. До тех пор, пока вы используете компилятор C# 6, вы можете использовать эти функции.

What is the difference between C# and .NET?

Так что да, это хорошо использовать их в проекте целевой платформы .NET 4.5.

8

В существующих ответах говорится об этом как о функции C# 6 без компонента .NET framework.

Это полностью относится к nameof - но только несколько true для интерполяции строк.

Строка интерполяция будет использовать string.Format в большинстве случаев, но если вы используете .NET 4.6, можно также преобразовать интерполированную строку в FormattableString, что полезно, если вы хотите инвариантное форматирование:

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

Очевидно, что это не будет работать, если просто вызывается вызов string.Format ... вместо этого, в данном случае она вызывает string.Format в заявлении, присваивающей к local и вызывает FormattableStringFactory.Create в заявлении, присваивающей к invariant и вызывает FormattableString.Invariant на результат. Если вы попытаетесь скомпилировать это с более ранней версией фреймворка, FormattableString не будет существовать, поэтому он не будет компилироваться. Вы можете предоставить свою собственную реализацию FormattableString и FormattableStringFactory, если вы действительно этого хотите, и компилятор будет использовать их соответствующим образом.

Смежные вопросы