Неможливо повернути 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, то дуже дивно, що нам потрібно це робити для кожного проекту?!


Відповіді:


129

Я щойно пробіг цю сторінку в Росліні, де описано наступні кроки, щоб це працювало:

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

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

Після цих кроків він зараз працює. Але насправді дуже дивно, що нам потрібно це робити для кожного окремого проекту, який ми починаємо! Сподіваємось, це виправлено, коли ми дійдемо до офіційного випуску!


2
У наступному випуску має бути виправлення коду, яке дозволяє легко додати пакет.
svick

6
Це рішення мені допомогло; навіть з повною версією VS2017 Professional, завантаженою в березні 2017 року!
Nij

2
Дуже дратує, що це не офіційною мовою. Натрапив на ту ж проблему, оскільки це виправлення. Вони продають це як функцію мови C # 7, хоча насправді це більше функція розширення C # 7. Я припускаю, що все може стати таким волохатим, коли ви використовуєте новий компілятор Roslyn (яким я є шанувальником) ... в будь-якому випадку, це сумний побічний ефект IMO.
Michael Puckett II

10
@MichaelPuckettII Я думаю, це тому, що для цієї функції потрібні класи, щоб існувати в .NET framework, і вони ще не випустили нову, тому тимчасовим рішенням було включити це як Nuget-пакет. Коли вийде наступний .NET framework, класи, необхідні для цієї функції, повинні бути вже вбудованими. Якщо ні, то це проблема, яка потребує деяких пояснень.
Zein Makki

11
Щойно оновившись до .NET Framework 4.7, я отримав цю помилку, виявляється, ValueTuple тепер є частиною 4.7, тож рішення для мене було видалення пакета кортежів
chad.mellor

50

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

Тепер ValueTuple входить до складу .Net 4.7, тому вам не потрібно посилатися на ValueTuple вручну.

Все, що мені потрібно було зробити, щоб виправити помилку компіляції, було видалити посилання на System.ValueTuple з посилань на мій проект.


1
Чудово, наслідували вашу пропозицію, тепер вона включена в .NET 4.7, більше не потрібно встановлювати з NuGet. Дякую.
Gengjun Wu

ми можемо використовувати це на .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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.