String Interpolation не будет основываться на TeamCity
Для старого проекта, который я поддерживаю, я выполнял некоторую модернизацию. Это включает в себя различные вещи: нагрузка .NET Framework до 4.6 и другие обновления. Одна из вещей, которые нам нужно сделать, это сделать синтаксические обновления, если мы не изменим бизнес-логику.
Мы также недавно установили Visual Studio 2015 и последний и самый большой ReSharper, который показал, что "String Interpolation" теперь мы можем сделать в нашем коде. Для тех, кто не знает, интерполяция строк - это синтаксический сахар над вызовами string.Format
, как показано ниже:
// Normal, pre-C#6 formatting:
var foo = string.Format("Some string {0}", bar);
// C#6 String Interpolation
var foo = $"Some string {bar}";
Это действительно полезно, потому что это облегчает чтение сообщений и обычно занимает меньше символов.
... Однако TeamCity, похоже, не согласен. Когда я ввел код в коммит, я получил следующую ошибку:
Directory\SomeFile.cs: error CS1056: Unexpected character '$' [C:\ProjectDirectory\Project.Core\Project.Core.csproj]
На первый взгляд кажется, что какой-то бит-предшественник предшествует С# 6, потому что это новая функция для С# 6.
Вот что я заметил, поэтому я теоретизирую, что это происходит:
-
Конфигурация сборки указывает на C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe
Это дает мне паузу, потому что предположительно .NET 4.6 установлен в нашем агенте сборки.
-
При попытке напрямую установить .NET 4.6 из установщика Microsoft это терпит неудачу, потому что .NET 4.6 уже установлен на агент bulid.
-
Наш этап компиляции конфигурации сборки также дает мне паузу. Первые две строки, которые отмечают версию Build Engine и рамки, соответственно, [exec] Microsoft (R) Build Engine version 4.6.1055.0 [exec] [Microsoft .NET Framework, version 4.0.30319.42000]
Механизм сборки, очевидно, v4.6, но .NET Framework 4.0!? Правильно ли я это читаю?
-
Наконец, одна из последних строк журнала сборки: [NAnt output] External Program Failed: C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe (return code was 1)
Это не 4.6... это?
Вопрос: Дважды. Этот первый вопрос может быть глупым, но я действительно компилирую против .NET 4.6? Во-вторых, каким образом я могу получить синтаксис String Interpolation в С# 6 для фактической сборки, если я укажу на .NET 4.6?
Я явно пропустил что-то обо всем этом, я не уверен, что A), сколько вещей мне не хватает, или B), что именно я должен делать с ними.
Ответы
Ответ 1
Я чувствую себя оправданным; смешной путь/версия на самом деле указывает на истинную проблему: MSBuild.exe
, который выполнялся, был не тем, который был установлен VS2015.
Как я читал здесь, версия MSBuild.exe
, которая находится в C:\Windows\Microsoft.NET\Framework\v4.0.30319
, на самом деле является версией до С# 6; по какой-то причине установка Visual Studio 2015 делает не эту установку!
Вместо этого вы должны указать свой вызов MSBuild.exe
на копию, хранящуюся в C:\Program Files (x86)\MSBuild\14.0\Bin
, для компиляции с последней версией С#, как установлено VS2015.