C# 7 ValueTuple 编译错误

C# 7 ValueTuple compile error

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

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

MyProject.Services MyProject.WebApi

在 MyProject.Services 中,我有一个 class 使用这样的方法

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 正在工作并解构元组,但是当我编译它时失败,错误列表 window 中没有任何错误。 在输出 windows 我有这个错误:

2>MyController.cs(83,31,83,40): error CS1061: 'ValueTuple' does not contain a definition for 'fCount' and no extension method 'fCount' accepting a first argument of type 'ValueTuple' could be found (are you missing a using directive or an assembly reference?) 2>MyController.cs(84,39,84,49): error CS1061: 'ValueTuple' does not contain a definition for 'cCount' and no extension method 'cCount' accepting a first argument of type 'ValueTuple' could be found (are you missing a using directive or an assembly reference?) 2>MyController.cs(85,35,85,40): error CS1061: 'ValueTuple' does not contain a definition for 'aCount' and no extension method 'aCount' accepting a first argument of type 'ValueTuple' could be found (are you missing a using directive or an assembly reference?)

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

知道哪里出了问题吗?

编辑 1:

这段代码有效,统计数据被很好地解构了。我可能遇到了一个错误。

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 此处打开:https://github.com/dotnet/roslyn/issues/16200

我想是因为你没有定义fCount、acCount和aCcount。试试这个

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 建议编辑

看看this post

如果有人落入同样的陷阱,要解决这个问题你需要更新这个包: Microsoft.Net.Compilers 到 2.0(需要显示预发布)

我只想补充其他答案。

从引用中删除 System.valuetuple。否则,它不起作用,我不知道为什么。基本上,值元组已经在 4.7.2 中,所以如果你使用 visual studio 2019 你就全部设置好了。

如果您使用 visual studio 2019 而我使用了,那对我来说就是有用的。我不知道为什么。不需要金块。无需直接引用。

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