c#7元组不起作用(roslyn编译器异常)

rdv*_*ren 6 c# tuples razor roslyn c#-7.0

有一段时间我们在剃刀文件中使用了一些新的c#7.0功能.我们已将Roslyn编译器集成到我们的Web项目中,这些项目目前正在针对.NET Framework 4.6.2.

今天我想在剃刀文件中试用元组,如下所示:

@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
}
Run Code Online (Sandbox Code Playgroud)

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

CS8137:无法定义使用元组的类或成员,因为无法找到编译器所需类型"System.Runtime.CompilerServices.TupleElementNamesAttribute".你错过了参考吗?

CS8179:未定义或导入预定义类型'System.ValueTuple`2'

这导致我/sf/answers/2857874561/提到我应该将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" />
Run Code Online (Sandbox Code Playgroud)

所以,我现在回来使用旧的Tuple<>.我想知道是否有人知道我在忽视什么.

编辑11/16/2017:

所以我改变了public (string labelName, string sfName) GetNames(PurchaseType purchaseType)进入public ValueTuple<string, string> GetNames(PurchaseType purchaseType),这给了我以下异常:

CS0433:类型'ValueTuple'存在于'System.ValueTuple,Version = 4.0.2.0,Culture = neutral,PublicKeyToken = cc7b13ffcd2ddd51'和'mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089'

这导致我'ValueTuple <T1,T2>'存在于'System.ValueTuple ...'和'mscorlib ......'中,给出了实际答案.我已经安装了.NET Framework 4.7,并且由于razor是在运行时编译的,所以它只使用该版本.

亲切的问候,里克

SLa*_*aks 6

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

您需要在以下位置添加System.ValueTupleASP.Net运行时编译Web.config:

<system.web>
    <compilation>
      <assemblies>
        <add assembly="System.ValueTuple" />
Run Code Online (Sandbox Code Playgroud)