C#编译器对待数组元素是否与对待同一类型变量不同?!(System.ArrayTypeMismatchException



我今天在做一些事情,但我注意到代码中有一些内容,所以让我解释一下情况。

我从不同的接口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查询?

使用某一类型的数组,可以存储该类型的项,或者特定于项,但不特定于项。因此,您可以将列表存储在可枚举的数组中(因为所有列表都是可枚举的(,但不能将可枚举存储在列表数组中(由于并非所有可枚举都是列表(。

相关内容

最新更新