Невозможно вернуть Tuple из метода с использованием Visual Studio 2017 и C # 7.0

98

Я установил Visual Studio 2017 Community, выпущенный неделю назад, и начал изучать новые возможности C # 7.

Итак, я создал простой метод, который возвращает два значения:

public class Program
{
    public static void Main(string[] args)
    {
        (int sum, int count) a = ReturnTwoValues();
    }

    static (int sum, int count) ReturnTwoValues() => (1, 1);
}

Компилятор выдает ошибку:

Ошибка CS8137 Невозможно определить класс или член, использующий кортежи, поскольку не удается найти требуемый компилятору тип System.Runtime.CompilerServices.TupleElementNamesAttribute. Вам не хватает ссылки?

Я попытался найти ссылку в фреймворке с таким именем, но безуспешно!

Если нам нужны дополнительные материалы для использования функций C # 7.0, то очень странно, что нам нужно делать это для каждого проекта ?!

Зейн Макки
источник
Возможный дубликат включения C # 7 в приложении asp.net
Хасан Абдулла

Ответы:

129

Я только что просмотрел эту страницу в Roslyn, в которой описаны следующие шаги, чтобы заставить это работать:

  1. Начать проект C #
  2. Добавить ссылку на System.ValueTuple пакет из NuGet (предварительная версия)

введите описание изображения здесь

После этих шагов он теперь работает. Но это действительно очень странно, что нам нужно делать это для каждого отдельного проекта, который мы начинаем! Надеюсь, это будет исправлено, когда мы дойдем до официального выпуска!

Зейн Макки
источник
2
Одна вещь, которая должна быть в следующем выпуске, - это исправление кода, которое позволит вам легко добавить пакет.
svick
6
Это решение мне помогло; даже с полной версией VS2017 Professional, загруженной в марте 2017 года!
Nij
2
Очень раздражает, что это не на официальном языке. Возникла та же проблема с этим исправлением. Они рекламируют это как функцию языка C # 7, хотя на самом деле это скорее функция расширения C # 7. Я думаю, что все может стать непростым, когда вы используете новый компилятор Roslyn (который я фанат) ... в любом случае, это печальный побочный эффект ИМО.
Michael Puckett II
10
@MichaelPuckettII Я думаю, это связано с тем, что для этой функции нужны классы, которые должны существовать в платформе .NET, и они еще не выпустили новый, поэтому временным решением было включить это как пакет Nuget. Когда будет выпущена следующая платформа .NET, классы, необходимые для этой функции, должны быть уже встроены. Если нет, то это проблема, требующая объяснения.
Zein
11
После простого обновления до .NET Framework 4.7 я получил эту ошибку, оказалось, что ValueTuple теперь является частью 4.7, поэтому удаление пакета кортежей было для меня решением
chad.mellor
52

Я начал получать эту ошибку после того, как установил .Net 4.7 Framework и изменил свой проект на целевой .Net 4.7.

ValueTuple теперь включен в .Net 4.7, поэтому вам не нужно ссылаться на ValueTuple вручную.

Все, что мне нужно было сделать, чтобы исправить ошибку компиляции, - это удалить ссылку на System.ValueTuple из ссылок на мой проект.

аааа bbbb
источник
1
Отлично, следил за вашим предложением, теперь он включен в .NET 4.7, больше не нужно устанавливать из NuGet. Спасибо.
Gengjun Wu 01
можем ли мы уже использовать это в .net. Это 2019 год. Я
нацелен
2

Я также столкнулся с этой проблемой, когда обновился с .NET 4.6.2 до .NET 4.7.2. К сожалению, мне не удалось удалить ссылку на пакет, System.ValueTupleпотому что от него зависит другой пакет NuGet, который я использую.

Наконец, я смог найти основную причину: mscorlib.dllв папке проекта валялась версия .NET 4.6.2 (результат операции публикации), и MSBuild решила сослаться на эту сборку вместо официального справочника .NET 4.7.2. сборка, расположенная в C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.7.2.

Из-за того, что System.ValueTuple был введен в .NET 4.7, MSBuild не удалось выполнить компиляцию, поскольку не смог найти тип в эталонной сборке .NET 4.6.2.

Оливер Ханаппи
источник
1

Я тоже получил эту ошибку после обновления до .NET 4.7.2 и смог исправить ее, переустановив пакеты nuget, используя:

Update-Package -Reinstall
мартинос
источник