我有这样的代码:
foreach (Type t in types ?? asm.GetTypes())
如果没有提供类型,那么应循环ArrayList
types
中的所有类型或程序集类型。由于System.Array
System.Collections.ArrayList
IEnumerable
实现UrlHelper
,我希望循环起作用。
然而编译器抱怨:
运营商'??'不能应用于'System.Collections.ArrayList'和'System.Type []'类型的操作数
我想我错过了一些非常明显的东西,但它是什么?
答案 0 :(得分:3)
您不应该在2015年真正使用ArrayList
。ArrayList
不支持IEnumerable<>
界面。
您可以强制使用IEnumerable
非通用接口:
foreach (Type t in (IEnumerable)types ?? asm.GetTypes())
您的错误发生是因为??
运算符未搜索左右之间的最小公共类型。它只是检查是否可以将右类型隐式转换为左类型,或者是否可以将左类型隐式转换为右类型。很明显,Type[]
无法转换为ArrayList
,ArrayList
无法转换为Type[]
。
答案 1 :(得分:0)
你可以把我们??两种不同结构的操作员。您的字段&#39;类型&#39;应该是System.Type []才能工作。
答案 2 :(得分:0)
我不确切知道推理是什么,但我想这是类型安全,你可以在ArrayList
添加任何内容。
ArrayList al = new ArrayList{1,2,3};
int[] il = new int[]{1,2,3};
两者看起来非常相似,但现在让我们尝试向他们添加一个列表。
ArrayList al = new ArrayList{1,2,3, new ArrayList()}; // succeeds
int[] il = new int[]{1,2,3, new ArrayList() };
编译错误(第12行,第31行):无法隐式转换类型&#39; System.Collections.ArrayList&#39;到&#39; int&#39;
这让我相信编译器认为既然你最初希望使用一个arraylist,你就不能保证每个元素都是Type
类型的