一段时间以来,我们在 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" />