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

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

Я установил Visual Studio 2017 Community, выпущенную неделю назад, и начал изучать новые возможности С# 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' не может быть нашел. Вам не хватает ссылки?

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

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

4b9b3361

Ответ 1

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

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

enter image description here

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

Ответ 2

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

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

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

Ответ 3

Я также столкнулся с этой проблемой при обновлении с .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.