C# 7 值元组编译错误

34

我正在使用VS2017 RC,我的应用程序目标是 .NET Framework 4.6.1。

我有两个引用了 System.ValueTuple 4.3 的程序集:

MyProject.Services MyProject.WebApi

在 MyProject.Services 中,我有一个类,其中有一个方法如下:

public async Task<(int fCount, int cCount, int aCount)> GetAllStatsAsync()
{
    // Some code...
    return (fCount, cCount, aCount);
}
在 MyProject.WebApi 中,我有一个控制器使用这个方法,就像这样:
public async Task<HttpResponseMessage> GetInfoAsync()
{
    // Some code...
    var stats = await _myClass.GetAllStatsAsync();

    var vm = new ViewModel
             {
                 FCount = stats.fCount,
                 CCount = stats.cCount,
                 ACount = stats.aCount
             };

     return Request.CreateResponse(HttpStatusCode.OK, vm);
}
Intellisense正常工作并对元组进行了解构,但编译时在错误列表窗口中没有任何错误。在输出窗口中出现以下错误:
2>MyController.cs(83,31,83,40):错误CS1061:'ValueTuple'不包含“fCount”的定义,也没有接受第一个参数类型为“ValueTuple”的扩展方法“fCount”可以找到(是否缺少使用指令或程序集引用?)2>MyController.cs(84,39,84,49):错误CS1061:“ValueTuple”不包含“cCount”的定义,也没有接受类型为“ValueTuple”的第一个参数的扩展方法“cCount”可以找到(是否缺少使用指令或程序集引用?)2>MyController.cs(85,35,85,40):错误CS1061:'ValueTuple'不包含“aCount”的定义,也没有接受第一个参数类型为“ValueTuple”的扩展方法“aCount”可以找到(是否缺少使用指令或程序集引用?)
我尝试添加DEMO和DEMO_EXPERIMENTAL构建标志,但仍然失败。
有什么想法是错的吗?
编辑1: 这段代码可行,状态良好解构。我可能碰到了一个 bug。
public async Task<HttpResponseMessage> GetInfoAsync()
{
    // Some code...
    var stats = await _myClass.GetAllStatsAsync();
    var tu = stats.ToTuple();
    var vm = new ViewModel
             {
                 FCount = tu.Item1,
                 CCount = tu.Item2,
                 ACount = tu.Item3
             };

     return Request.CreateResponse(HttpStatusCode.OK, vm);
}

编辑2:

在此处开启了Github问题


当您查看“stats”的调试时,您会看到什么? - BugFinder
如果你将 var stats = await ... 替换为 (fCount, cCount, aCount) stats = await ... 会发生什么? - Gusdor
我遇到了这个错误 error CS1003: 语法错误,期望 '=>' - JuChom
1
可能是一个bug,其中元组作为泛型参数没有被正确编译。 - Serve Laurijssen
5
如果您使用通用访问器(即 Item1、Item2),那么这段代码会编译吗?我猜这是一个错误。 - Sunshine
显示剩余5条评论
4个回答

47
如果有人陷入相同的困境,需要修复此问题,请更新此程序包:Microsoft.Net.Compilers至2.0版本(需要显示预发布)。

2
只是想提醒一下,截止到现在(我假设是VS2017 RTM),2.0.1已经发布了,不再是预发布版本。 - Rudi Visser
谢谢亲爱的@Swell,你节省了我的时间。 - Imran Sh
5
你是一个救命稻草。在编辑器中代码显示正常,错误列表中没有错误,但输出窗口显示错误。一次快速搜索找到了这个问题,立即解决了问题。 - vkapadia

1
我只是想补充其他答案。
从引用中删除System.valuetuple。否则,它不起作用,我不知道为什么。基本上,value tuple已经在4.7.2中了,所以如果你使用visual studio 2019,一切都准备就绪。
如果你使用visual studio 2019,就像我一样,这就是对我有效的方法。我不太清楚原因。不需要nugget。不需要直接引用它。

enter image description here

将您的项目定位为使用 .NET Framework 4.7.2,并删除对 valuetuple 的引用。


如果是通过NuGet安装的,最好/容易通过NuGet卸载。 - Craig

0

我认为这是因为您没有定义fCount、cCount和aCount。请尝试以下代码:

public async Task<(int fCount, int cCount, int aCount)> GetAllStatsAsync()
{
    // Some code...
    //fCount, cCount, aCount are not defined here, so you should define them

    var fCount = 0;
    var cCount= 0;
    var aCount = 0;
    return (fCount , cCount, aCount );

    //Other ways:
    //return (fCount : 0, cCount: 0, aCount : 0);
    //return new (int fCount , int cCount, int aCount ) { fCount = 0, cCount = 0, aCount = 0 };
}

public async Task<HttpResponseMessage> GetInfoAsync()
{
    // Some code...
    var stats = await _myClass.GetAllStatsAsync();

    var vm = new ViewModel
             {
                 FCount = stats.fCount,
                 CCount = stats.cCount,
                 ACount = stats.aCount
             };

     return Request.CreateResponse(HttpStatusCode.OK, vm);
}

根据@Swell的建议进行编辑

请查看此篇文章


4
OP希望使用值元组,但是这里使用了记录类。 - Gusdor
我自己对新语法不太熟悉,但似乎没有使用非泛型类。Task<(int fCount, int cCount, int aCount)> 中的 <> 显然使它看起来是泛型的,我相信其中的语法是新的隐式元组语法。我只看到过它用作直接返回参数的示例,但这个编译通过的事实表明这是将其用作泛型参数的方式。 - Chris
我找不到任何使用Task<(int fCount, int cCount, int aCount)>这种方式的示例。我几乎确定任务结果始终是TResult,但我不熟悉新的语法。我会尝试找一些资料。谢谢。 - Facundo La Rocca
太好了!我已经根据你的建议编辑了我的答案,如果你有时间,请看一下。我学到了新东西。谢谢。 - Facundo La Rocca
OP只是简单地在评论中提到他们省略了GetAllStatsAsync的主体部分。如果他们没有定义这些变量,那么错误消息将完全不同于他们现在得到的。 - Servy

0

我的问题不是在编译错误,而是在运行时。

但我认为这个修复方法仍然有效,可能也能帮助到其他人。

将我的项目转换为 .Net Framework 4.7.2 后,我不得不手动更新 System.ValueTuple 的提示路径,从 net461 更新到 net47。

<HintPath>..\Solutions\packages\System.ValueTuple.4.5.0\lib\net47\System.ValueTuple.dll</HintPath>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接