如何在T4模板中使用C#v6的最新功能?

Cro*_*ono 17 .net c# t4 visual-studio visual-studio-2015

我正在尝试在Visual Studio 2015中运行新的T4模板.但是它无法在此行编译:

var message = $"Linked table '{linkedTable}' does not exist.";
Run Code Online (Sandbox Code Playgroud)

编译器报告'$'字符是意外的.但是,根据新的字符串插值功能指南,此语法应在C#v6中有效.

有没有办法让T4模板引擎使用较新的C#版本,而不是在外部库中编译我的代码

更新:

以下是该文件的声明元素,作为参考:

<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ output extension=".sql" #>
<#@ SqlModelDirective processor="SqlModelDirectiveProcessor" #>

<#@ import namespace="System" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="Microsoft.SqlServer.Dac" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="Microsoft.SqlServer.Dac.Model" #>
Run Code Online (Sandbox Code Playgroud)

除了SqlModelDirective元素,我认为这是非常标准的.

Pan*_*vos 15

您现在不能在T4模板中使用C#6,因为它们不使用最新的编译器.

您可以compilerOptiontemplate指令的属性中指定编译器选项.如果使用了最新的编译器,您可以使用:

<#@ template debug="false" hostspecific="false" language="C#" 
    compilerOptions="/langversion:6" #>
Run Code Online (Sandbox Code Playgroud)

当我尝试这个时,我收到以下错误:

编译转换:/ langversion的选项'6'无效; 必须是ISO-1,ISO-2,3,4,5或默认值

UPDATE

在Github上的ASP.NET存储库中找到了这个讨论.似乎ASP.NET团队正在寻求用Razor取代T4(这不是一个坏主意BTW).不知道@davidfowl是否有更多信息;)

更新2

David Fowler 在Twitter上做出回应 --T4使用的CodeDom尚未更新为使用Roslyn.虽然一个NuGet包与更换的CodeDOM提供商,它仅适用于ASP.NET 4.x的项目,而不是T4.

所以现在没有T4中的C#6.


Dou*_*las 10

您应该升级到2016年3月30日发布的Visual Studio 2015 Update 2,它引入了此类功能.在其他"其他变化"下:

增强的T4文本模板,以便它们现在支持C#6.0.

但是,Visual Studio 2015 Update 3中的功能再次中断.

  • 真?我正在使用VS2015 Update 3和C#6功能*在T4模板中不支持*. (2认同)
  • 在VS2017(26403.7)中也不起作用 (2认同)