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

标签 c# .net visual-studio visual-studio-2015 t4

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

var message = $"Linked table '{linkedTable}' does not exist.";

编译器报告“$”字符是意外的。然而,根据新的 string interpolation,此语法在 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" #>

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

最佳答案

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

您可以在 templatecompilerOption 属性中指定编译器选项指示。如果使用最新的编译器,您可以使用:

<#@ template debug="false" hostspecific="false" language="C#" 
    compilerOptions="/langversion:6" #>

当我尝试这样做时,出现以下错误:

Compiling transformation: Invalid option '6' for /langversion; must be ISO-1, ISO-2, 3, 4, 5 or Default

更新

找到 this discussion在 Github 上的 ASP.NET 存储库上。似乎 ASP.NET 团队正在寻求用 Razor 替换 T4(顺便说一句,这不是一个坏主意)。想知道@davidfowl 是否有更多信息;)

更新 2

大卫·福勒 responded on Twitter - T4 使用尚未更新为使用 Roslyn 的 CodeDom。虽然有一个 带有 replacement CodeDom providers 的 NuGet 包,它仅适用于 ASP.NET 4.x 项目,不适用于 T4。

所以目前 T4 中没有 C# 6。

关于c# - 如何在 T4 模板中使用 C# v6 的最新功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32505209/

相关文章:

c# - 如何记录 BackgroundWorker.RunWorkerAsync(Object) 的参数?

c# - 计算包含范围的两个列表之间的交集/截距

C# 使用 zip 存档 System.IO.Compression 创建 zip 文件

Visual Studio 的 Python 工具在子进程中设置断点

c# - 如何在渲染时获取 C# ASP.NET ListView 中当前记录的索引

c# - 为什么桌面图标与资源管理器图标不同?

c# - 从C#中的抽象类获取调用类名

c# - 从窗口句柄获取真实文本

visual-studio - 从挂起更改的工作项选项卡上的列表中删除最近使用的查询

c# - 更改 VSPS 的类别名称