我今天在做一些事情,但我注意到代码中有一些内容,所以让我解释一下情况。
我从不同的接口concreate类中获得IEnumerable数据,看看这个示例代码
public interface ISampleClass {
IEnumerable<ISampleClass> GetSampleData();
}
public class SampleClassAsPerson : ISampleClass
{
public IEnumerable<ISampleClass> GetSampleData()
{
// Return data from DB
// Return list for this example
return new List<SampleClassAsPerson>() {new SampleClassAsPerson(), new SampleClassAsPerson()};
}
}
我把来自GetSampleData((方法的数据放在我的接口的数组中(在下面的代码中可以看到(,我注意到我的数组没有保存与来自同一类型的变量相同的数据,让我们看看代码
public class TestArrayAndSingle
{
public const byte ARRAY_SIZE = 10;
public const byte FIRST_PLACE_IN_ARRAY = 0;
public static void DoTheTest()
{
// First as single element
IEnumerable<ISampleClass> singleIEnumerable = new List<ISampleClass>();
singleIEnumerable = new SampleClassAsPerson().GetSampleData(); // Works Fine for variable of type new List<ISampleClass>()
// Second as array of elements
IEnumerable<ISampleClass>[] arrayOfIEnumerable = new IEnumerable<ISampleClass>[ARRAY_SIZE];
arrayOfIEnumerable[FIRST_PLACE_IN_ARRAY] = new SampleClassAsPerson().GetSampleData(); // Works fine also
IEnumerable<ISampleClass>[] arrayOfList = new List<ISampleClass>[ARRAY_SIZE];
arrayOfList[FIRST_PLACE_IN_ARRAY] = new SampleClassAsPerson().GetSampleData(); // Return ArrayTypeMismatchException, This should be the same as singleIEnumerable I guess(new List<ISampleClass>())
}
}
因此,对于第一个IEnumerable singleIEnumerable=new List((;工作正常,但在IEnumerable[]arrayOfList=new List[ARAY_SIZE]中;第一个项给出异常(System.ArrayTypeMismatchException-试图访问与数组不兼容的类型的元素。(。
有人能解释一下原因吗?数组中的元素和同一类型的变量区别对待吗?!
您有一个List<T>
的集合,并试图在其中存储一个更通用的IEnumerable<T>
。但并非所有的IEnumerable<T>
都是列表,因此编译器不允许这样做。如果IEnumerable<T>
是一个堆栈呢?还是链接列表?还是LINQ查询?
使用某一类型的数组,可以存储该类型的项,或者特定于的项,但不特定于的项。因此,您可以将列表存储在可枚举的数组中(因为所有列表都是可枚举的(,但不能将可枚举存储在列表数组中(由于并非所有可枚举都是列表(。