Type int []如何实现尚不存在的接口(对我而言)?

时间:2016-06-30 22:10:40

标签: c# .net

今天我在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,事实证明我确实安装了它。

2 个答案:

答案 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...将返回nulltypeof(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在很大程度上是向后兼容的,而且只是简单地使用运行时环境。