什么时候 C# 列表不是 IEnumerable?

Gar*_*rom 1 .net c# .net-core

我希望能够确定传递的参数是否为 IEnumerable。

static bool TestForEnumerable(dynamic toTest)
{
    return toTest is IEnumerable<Object>;
}
Run Code Online (Sandbox Code Playgroud)

我编写了以下控制台应用程序来调查我遇到的问题...

static void Main(string[] args)
{
    Program _program = new Program();
    Console.WriteLine("");

    List<TestObject> toObj = new List<TestObject>
        {
            new TestObject { FirstName = "James", MiddleName = "Maitland", LastName = "Stewart", DOB = new DateTime(1908, 05, 20), IsFemale = false },
            new TestObject { FirstName = "Gary", MiddleName = "James", LastName = "Cooper", DOB = new DateTime(1901, 05, 07), IsFemale = false },
            new TestObject { FirstName = "Archibald", MiddleName = "Alec", LastName = "Leach", AKA="Cary Grant", DOB = new DateTime(1904, 01, 18), IsFemale = false },
            new TestObject { FirstName = "Erol", MiddleName = "Leslie Thompson", LastName = "Flynn", DOB = new DateTime(1909, 06, 20), IsFemale = false },
            new TestObject { FirstName = "Humphrey", MiddleName = "DeForest", LastName = "Bogart", DOB = new DateTime(1899, 12, 25), IsFemale = false },
            new TestObject { FirstName = "Marion", MiddleName = "Robert", LastName = "Morrison", AKA="John Wayne", DOB = new DateTime(1907, 05, 26), IsFemale = false },
        };

    var kvpObj = new List<KeyValuePair<string, string>>
        {
            new KeyValuePair<string, string>("GPC", "3"),
            new KeyValuePair<string, string>("CENTRAL CONTRACT", "4"),
            new KeyValuePair<string, string>("N/A", "2"),
            new KeyValuePair<string, string>("--Select Item--", "-1"),
        };

    Console.WriteLine(String.Format("List<TestObject> is IEnumerable : {0}", TestForEnumerable(toObj)));
    Console.WriteLine(String.Format("List<KeyValuePair<string, string>> is IEnumerable : {0}", TestForEnumerable(kvpObj)));

}
Run Code Online (Sandbox Code Playgroud)

这个测试的结果是......

List<TestObject> is IEnumerable : True
List<KeyValuePair<string, string>> is IEnumerable : False
Run Code Online (Sandbox Code Playgroud)

所以问题是......这些都是实现IEnumerable的列表。为什么 KeyValuePairs 列表不被视为 IEnumerable?

Mar*_*ell 10

不是IEnumerable<object>,因为它是KeyValuePair<TKey, TValue>值类型 ( struct),并且通用方差规则不允许值类型并且object在类型测试期间可以互换(因为需要转换 - 装箱)。

所以:虽然它不是IEnumerable<object>,但在非通用意义上它IEnumerable