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

Я установил 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, то очень странно, что нам нужно делать это для каждого проекта?!

2 ответа

Решение

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

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

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

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

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

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

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

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

Update-Package -Reinstall

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

Наконец, я смог определить основную причину: была версия.NET 4.6.2. mscorlib.dll валяется в папке проекта (результат операции публикации), и 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.

Другие вопросы по тегам