gpt4 book ai didi

c# - IEnumerable> 类型的参数接受 List> 而 IEnumerable<(int, IEnumerable)> 不接受?

转载 作者:行者123 更新时间:2023-11-30 20:27:59 26 4
gpt4 key购买 nike

我有课

public class Test
{
public void M1(IEnumerable<IEnumerable<string>> p) { }
public void M2(IEnumerable<(int, IEnumerable<string>)> p) { }
}
var t = new Test();

下面的代码工作正常。

var d1 = new List<List<string>> { new List<string>{ "test" } };
t.M1(d1);

但是,下面的代码会报错

var d2 = new List<(int, List<string>)> { (1, new List<string>{ "test" }) };
t.M2(d2);

cannot convert from 'System.Collections.Generic.List<(int, System.Collections.Generic.List)>' to 'System.Collections.Generic.IEnumerable<(int, System.Collections.Generic.IEnumerable)>'

d2必须定义为

var d2 = new List<(int, IEnumerable<string>)> { (1, new List<string>{ "test" }) };

参数类型为 IEnumerable<IEnumerable<string>>接受 List<List<string>>同时 IEnumerable<(int, IEnumerable<string>)>不接受 List<(int, List<string>)>

最佳答案

它与 covariance and contravariance 有关.

IEnumerable<out T>是协变的,所以你可以分配一个更派生的 T 类型,一切都会好起来的 => IEnumerable<Base> b = new List<DerivedFromBase>();

但在你的情况下 IEnumerable<(int, IEnumerable<string>)>IEnumerable<ValueTuple<int, IEnumerable<string>>>相同因为ValueTuple<int, List<string>>不是 ValueTuple<int, IEnumerable<string>> 的派生类型你不能那样使用它。

更新感谢@JeppeStigNielsen

主要原因是因为协变从不与值类型一起工作,而 C# 7 的新元组是值类型,而且 ValueType<T1, T2>在 T2 中不是协变的

关于c# - IEnumerable<IEnumerable<string>> 类型的参数接受 List<List<string>> 而 IEnumerable<(int, IEnumerable<string>)> 不接受?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47996103/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com