C#7 ValueTuple编译错误

我正在使用VS2017 RC,我的应用程序以net framework 4.6.1为目标。

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

MyProject.Services MyProject.WebApi

在MyProject.Services中,我有一个类,有这样的方法

public async Task GetAllStatsAsync() { // Some code... return (fCount, cCount, aCount); } 

在MyProject.WebApi中,我有一个使用此方法的控制器:

 public async Task 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’的定义,并且没有扩展方法’fCount’接受类型’ValueTuple’的第一个参数可以找到(你错过了using指令或程序集引用吗?)2> MyController.cs(84,39,84,49):错误CS1061:’ValueTuple’不包含’cCount’的定义,也没有扩展方法’cCount’接受可以找到类型为’ValueTuple’的第一个参数(你是否缺少using指令或程序集引用?)2> MyController.cs(85,35,85,40):错误CS1061:’ValueTuple’不包含定义对于’aCount’并且没有扩展方法’aCount’可以找到接受类型’ValueTuple’的第一个参数(你是否缺少using指令或汇编引用?)

我尝试添加DEMODEMO_EXPERIMENTAL构建标志但仍然失败。

什么是错的?

编辑1:

此代码有效,统计数据解析得很好。 我可能遇到了一个bug。

 public async Task 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上打开问题: https : //github.com/dotnet/roslyn/issues/16200

如果有人陷入同一陷阱,要解决此问题,您需要更新此软件包:Microsoft.Net.Compilers到2.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 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建议

看看这篇文章