Разобрать с помощью списка <T> - PullRequest
4 голосов
/ 23 июня 2019

Есть ли способ разрешить деконструкции списка кортежей в List<T>?

Я получаю следующую ошибку компиляции со следующим примером кода:

Не могу неявнопреобразовать тип 'System.Collections.Generic.List ' в 'System.Collections.Generic.List <(int, int)>'

using System;
using System.Collections.Generic;

namespace Deconstruct
{
    class Test
    {
        public int A { get; set; } = 0;

        public int B { get; set; } = 0;

        public void Deconstruct(out int a, out int b)
        {
            a = this.A;
            b = this.B;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var test = new Test();

            var (a, b) = test;

            var testList = new List<Test>();

            var tupleList = new List<(int, int)>();

            tupleList = testList; // ERROR HERE....
        }
    }
}

1 Ответ

7 голосов
/ 23 июня 2019

Вам необходимо явно преобразовать testList (List<Test>) в tupleList (List<(int, int)>)

tupleList = testList.Select(t => (t.A, t.B)).ToList();

Объяснение:

Вы используете код, как если быDeconstruct позволяет преобразовать класс, реализующий Deconstruct, в кортеж (ValueTuple), но это не то, что Deconstruct дозировка.

Из документации Деконструкция кортежей и других типов :

Начиная с C # 7.0, вы можете извлекать несколько элементов из кортежа или извлекать несколько полей, свойств и вычисленных значений из объекта в одной операции деконструкции.Когда вы деконструируете кортеж, вы присваиваете его элементам отдельные переменные .Когда вы деконструируете объект, вы присваиваете выбранные значения отдельным переменным .

Деконструкция возвращает несколько элементов отдельным переменным , а не кортежу (ValueTuple).

Попытка преобразовать List<Test> в List<(int, int)> следующим образом:

var testList = new List<Test>();
var tupleList = new List<(int, int)>();
tupleList = testList;

не может работать, потому что вы не можете преобразовать List<Test> в List<(int, int)>.Будет сгенерирована ошибка компилятора:

Не удалось неявно преобразовать тип 'System.Collections.Generic.List' в 'System.Collections.Generic.List <(int, int)>'

Попытка привести каждый элемент Test к (int, int) следующим образом:

tupleList = testList.Cast<(int, int)>().ToList();

не может работать, потому что вы не можете привести Test к (int, int).Будет сгенерирована ошибка времени выполнения:

System.InvalidCastException: 'Указанное приведение недопустимо.'

Попытка преобразовать один элемент Test в(int, int) вот так:

(int, int) tuple = test;

не может работать, потому что вы не можете преобразовать Test в (int, int).Он генерирует ошибку компилятора:

Не удается неявно преобразовать тип 'Deconstruct.Test' в '(int, int)'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...