Подтвердить что ты не робот

С# 7 Ошибка компиляции ValueTuple

Я использую VS2017 RC, а мое приложение нацелено на сетевую структуру 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 работает и деконструирует кортеж, но при компиляции он выходит из строя без окна Error in Error List. В выходных окнах я имею следующие ошибки:

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" (вам не хватает директива или ссылка на сборку?) 2 > MyController.cs(85,35,85,40): ошибка CS1061: "ValueTuple" не содержит определение для 'aCount' и метод расширения 'aCount', принимающий можно найти первый аргумент типа "ValueTuple" ( у вас отсутствует директива using или ссылка на сборку?)

Я попытался добавить флаги DEMO и DEMO_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

4b9b3361

Ответ 1

Если кто-то попадает в ту же ловушку, чтобы исправить это, вам нужно обновить этот пакет: Microsoft.Net.Compilers 2.0 (вам нужно показать предварительный выпуск)

Ответ 2

Я думаю, это потому, что вы не определили 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

Взгляните на этот пост

Ответ 3

Я просто хочу добавить к другим ответам.

Удалить System.valuetuple из ссылок. В противном случае это не работает, и я не знаю почему. По сути, значение кортежа уже в 4.7.2, и поэтому, если вы используете Visual Studio 2019, все готово.

Если вы используете визуальную студию 2019, и я это сделал, то, что сработало для меня. Я точно не знаю почему. Нет необходимости в самородке. Нет необходимости ссылаться на это напрямую.

enter image description here

Настройте свой проект на использование .net framework 4.7.2 и удалите ссылки на valuetuple.