今天我在Visual Studio 2010(.NET Framework 4.0版)中测试了以下代码
Type[] interfaces = typeof(int[]).GetInterfaces();
我很震惊地在列表中找到这两个:
System.Collections.Generic.IReadOnlyList`1 [[System.Int32,mscorlib, Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089]], mscorlib,版本= 4.0.0.0,文化=中性, 公钥= b77a5c561934e089
System.Collections.Generic.IReadOnlyCollection`1 [[System.Int32, mscorlib,版本= 4.0.0.0,文化=中性, PublicKeyToken = b77a5c561934e089]],mscorlib,Version = 4.0.0.0, Culture = neutral,PublicKeyToken = b77a5c561934e089
我之前在安装了框架4.5+的环境中使用过这两个界面,根据文档,both of创建了4.5。这在我的环境中不编译:
System.Collections.Generic.IReadOnlyList<int> list = new int[3];
类型或命名空间名称&#39; IReadOnlyCollection&#39;不存在于 namespace&#39; System.Collections.Generic&#39; (你错过了一个集会吗? 引用?)
当我尝试这个时:
int[] array = new int[3];
Type iReadOnlyCollection = Type.GetType("System.Collections.Generic.IReadOnlyCollection`1[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");
int count = (int)iReadOnlyCollection.GetProperty("Count").GetValue(array, null);
正如预期的那样, count
等于3。这是怎么回事?
编辑:我认为我的机器上没有安装框架4.5:
编辑2:感谢@ScottChamberlain,事实证明我确实安装了它。
答案 0 :(得分:6)
.NET 4.5 is an in-place update for .NET 4。这意味着,在Visual Studio中,在面向.NET 4时无法引用IReadOnlyCollection<T>
,如果安装了4.5更新,则运行时可以使用此类型。
尝试在没有.NET 4.5更新(即4.0)的环境中运行代码,代码将找不到接口类型。即,Type.GetType("System.Collections.Generic.IReadOnlyCollection`1...
将返回null
,typeof(int[]).GetInterfaces()
将不包含您提到的接口。
答案 1 :(得分:4)
您正在为.NET 4.0进行编译,因此编译器无法看到4.5特定类型。
您在.NET 4.5或4.6上运行,因此运行时可以看到特定于4.5的类型。
如果您希望您的应用程序在.NET 4.0上运行:您无法做到。 .NET 4.5和4.6是就地升级。安装后,您的系统上不再有.NET 4.0。您仍然可以运行.NET 4.0应用程序,因为.NET 4.5和4.6在很大程度上是向后兼容的,而且只是简单地使用运行时环境。