【问题标题】:T4 template: double.NaN not rendering correctlyT4 模板:double.NaN 未正确渲染
【发布时间】:2014-07-17 22:38:23
【问题描述】:

我有一个T4 template,它创建了一系列从预定义数据集派生的static readonly 变量。

如果我将 double.NaN 作为构造函数参数传递,则模板输出呈现为 NaN,而不是 double.NaN,正如我所料。 p>

模板的相关部分是:

<#= double.IsNaN(element.MeltingPoint) ? double.NaN : element.MeltingPoint #>

导致编译错误:
The name 'NaN' does not exist in the current context

如果我手动将代码更改为读取double.NaN,那么它编译得很好。

如何强制将输出读取为文字字符串double.NaN

【问题讨论】:

    标签: c# .net t4 template-engine


    【解决方案1】:

    调用double.NaN.ToString()(T4 引擎为了在生成的文件中打印结果)的结果是字符串“NaN”(事实上,它是特定于文化的)。

    如果你想要文字字符串double.NaN,那么使用字符串文字:

    <#= double.IsNaN(element.MeltingPoint) ? "double.NaN" : element.MeltingPoint.ToString() #>
    

    【讨论】:

    • 我认为 OP 想要常量值 double.NaN 而不是字符串文字。
    • 对...所以文字将出现在输出文件中,没有引号,然后将编译...
    • 太完美了,谢谢!有趣的是,这是我在发布之前尝试的第一件事。最后我不得不删除生成的文件,然后“运行自定义工具”,然后才能正确重新生成。无论如何,你的建议成功了:-)
    【解决方案2】:

    尝试使用 Double.NaN。虽然我怀疑 T4 引擎也可能会接受这一点。

    【讨论】:

    • OP 已经在使用double.NaNdoubleSystem.Double 在 C# 中没有区别。 C# 不是(蹩脚的智障)java。
    • 但是T4引擎和C#编译器不一样吧?
    • T4 引擎将模板编译成常规的 CLR 类并在它们上执行方法。 &lt;#=#&gt; 之间的代码块被评估为 C# 表达式。
    • 事实上,这些生成的类都是从Microsoft.VisualStudio.TextTemplating.TextTransformation派生的,并实现了一个名为TransformText()的方法,在模板被预处理成CLR类后由T4引擎执行.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-03
    相关资源
    最近更新 更多