C#7 ValueTuple编译错误

Swe*_*ell 31 c# c#-7.0

我正在使用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);
}
Run Code Online (Sandbox Code Playgroud)

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

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

编辑2:

在github上打开问题:https://github.com/dotnet/roslyn/issues/16200

Swe*_*ell 42

如果有人陷入同一陷阱,要修复此问题,您需要更新此软件包:Microsoft.Net.Compilers到2.0(您需要显示预发布)

  • 你是一个生命.代码在编辑器中显示正常,错误列表中没有错误,但在输出窗口中显示错误.快速搜索提出了这个问题,马上解决了这个问题. (5认同)
  • 请注意,截至目前(我假设VS2017 RTM)2.0.1已发布,而不是预发布. (2认同)