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

102
Zein Makki 27 Ноя 2016 в 10:27

4 ответа

Лучший ответ

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

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

enter image description here

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

129
AustinWBryan 11 Авг 2018 в 22:47

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

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

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

52
aaaa bbbb 26 Июн 2017 в 23:53

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

2
Oliver Hanappi 3 Сен 2019 в 18:38

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

Update-Package -Reinstall
1
martinoss 25 Окт 2019 в 10:44