一段时间以来,我们在 Razor 文件中使用了一些新的C#7.0功能。我们已经将Roslyn编译器集成到我们的Web项目中,这些项目当前针对的是.NET Framework 4.6.2。

今天,我想在一个 Razor 文件中尝试tuples,如下所示:

@functions
{
    public (string labelName, string sfName) GetNames(PurchaseType purchaseType)
    {
        switch (purchaseType)
        {
            case PurchaseType.New:
                return (labelName: Booklist.New, sfName: SpecflowIdentifiers.BooklistItem.CheckBoxNew);
            case PurchaseType.Rental:
                return (labelName: Booklist.Rent, sfName: SpecflowIdentifiers.BooklistItem.CheckBoxRental);
            case PurchaseType.SecondHand:
                return (labelName: Booklist.Secondhand, sfName: SpecflowIdentifiers.BooklistItem.CheckBoxSecondHand);
            default:
                throw new ArgumentOutOfRangeException(nameof(purchaseType), @"should not get here");
        }
    }
}

@helper RenderCheckbox(PurchaseType purchaseType, int index, decimal priceTo)
{
    var names = GetNames(purchaseType);
    var x = name.labelName;
    // render something
}

这将产生以下运行时异常:



这导致我进入https://stackoverflow.com/a/40826779/2772845,其中提到我应该将System.ValueTuple包添加到项目中。但是我已经添加了。

这些是配置中使用的软件包:
<package id="Microsoft.CodeDom.Providers.DotNetCompilerPlatform" version="1.0.8" targetFramework="net462" />
<package id="Microsoft.Net.Compilers" version="2.4.0" targetFramework="net462" developmentDependency="true" />
<package id="System.ValueTuple" version="4.4.0" targetFramework="net462" />

因此,我现在回到使用旧的Tuple<>
我想知道是否有人知道我在忽略什么。

编辑11/16/2017:

因此,我已经将public (string labelName, string sfName) GetNames(PurchaseType purchaseType)更改为public ValueTuple<string, string> GetNames(PurchaseType purchaseType),这给了我以下异常(exception):



这导致我'ValueTuple<T1, T2>' exists in both 'System.ValueTuple ...' and 'mscorlib ...'给出了实际答案。我已经安装了.NET Framework 4.7,并且由于razor是在运行时编译的,因此它仅使用该版本。

亲切的问候,
里克

最佳答案

Razor View 是由ASP.Net在运行时编译的,不会自动从项目中继承引用或其他设置。

您需要将System.ValueTuple添加到Web.config中的ASP.Net运行时编译中:

<system.web>
    <compilation>
      <assemblies>
        <add assembly="System.ValueTuple" />

10-05 18:26