gpt4 book ai didi

c# - 为什么 List 不是 IEnumerable

转载 作者:太空狗 更新时间:2023-10-29 21:14:12 24 4
gpt4 key购买 nike

[编辑:我很抱歉......原来的问题措辞含糊不清,我没有得到我正在寻找的答复]

对于任何继承自类 Y 的类 X,new List<X>() is IEnumerable<Y>是真的。但是,这不适用于结构:new List<int>() is IEnumerable<ValueType>是假的。我的问题是:为什么?

这是一个示例程序:

class Program
{
class Y { }
class X : Y { }
struct Z { }

static void Main(string[] args)
{
Test(new List<X>());
Test(new List<string>());
Test(new List<Z>());
Test(new List<int>());
Test("blah");
Test(1);
Console.ReadLine();
}

static void Test(object o)
{
if (o is IEnumerable<Y>)
{
Console.WriteLine(o + " is a list of Ys");
}
else if (o is IEnumerable<ValueType>)
{
Console.WriteLine(o + " is a list of ValueTypes");
}
else if (o is IEnumerable<object>)
{
Console.WriteLine(o + " is a list of objects");
}
else if (o is System.Collections.IEnumerable)
{
Console.WriteLine(o + " is most likely a list of ValueTypes or a string");
}
else
{
Console.WriteLine(o + " is not a list");
}

}
}

输出:

System.Collections.Generic.List`1[ConsoleApplication1.Program+X] is a list of Ys

System.Collections.Generic.List`1[System.String] is a list of objects

System.Collections.Generic.List`1[ConsoleApplication1.Program+Z] is most likely a list of ValueTypes or a string

System.Collections.Generic.List`1[System.Int32] is most likely a list of ValueTypes or a string

blah is most likely a list of ValueTypes or a string

1 is not a list

那为什么是new List<int>不是IEnumerable<ValueType>

最佳答案

协变仅适用于引用类型,不适用于值类型。所以一个List<string>可分配给 IEnumerable<object>因为string是一个引用类型,但是一个 List<int>不可分配给 IEnumerable<ValueType> .详见C#语言规范13.1.3.2节

关于c# - 为什么 List<int> 不是 IEnumerable<ValueType>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8144473/

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