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指令或汇编引用?)
我尝试添加DEMO和DEMO_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建议
看看这篇文章