有没有办法允许元组列表将其解构为 List<T>
?
我在以下代码示例中获取以下编译错误:
无法隐式转换类型'System.Collections.generic.list&lt;deconstruct.test>'to'system.collections.generic.list&lt;(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....
}
}
}
您需要明确将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&lt;(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('