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

How can Type int[] implement interfaces that do not yet exist (for me)?

今天我在Visual Studio 2010(.NET Framework 4.0版)中测试了以下代码

1
Type[] interfaces = typeof(int[]).GetInterfaces();

我很震惊地发现这两个在名单上:

System.Collections.Generic.IReadOnlyList`1[[System.Int32, mscorlib,
Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]],
mscorlib, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089

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

我以前在安装了框架4.5+的环境中使用过这两个接口,根据文档,这两个接口都是为4.5创建的。这不会在我的环境中编译:

1
System.Collections.Generic.IReadOnlyList<int> list = new int[3];

The type or namespace name 'IReadOnlyCollection' does not exist in the
namespace 'System.Collections.Generic' (are you missing an assembly
reference?)

当我尝试这个的时候:

1
2
3
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,原来是我安装的。


在.NET 4.5是一个灌注for .NET 4更新。这意味着,当你在Visual Studio .NET 4参考IReadOnlyCollection而无法瞄准,如果你运行。本型可有4.5安装更新。

在您的代码尝试运行环境,你不要有更新(IU,只是.NET 4.5 4.0)和代码不会找到的接口类型。IU,Type.GetType("System.Collections.Generic.IReadOnlyCollection`1...会返回不包含typeof(int[]).GetInterfaces()null,和你提到的接口。


你编译为.NET 4.0,所以4.5-specific湖泊类型不是由编译器。

你运行在.NET 4.5或4.6,这是由运行时4.5-specific湖泊类型。

如果你希望你的应用程序可以运行在.NET 4.0:你不能..net 4.5和4.6是在就地升级。一旦安装,您的系统它不再有.NET 4.0。你可以安静运行.NET应用.NET 4.0,4.5和4.6和AS是向后兼容的,这是不是想用简单的运行时环境。