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

Mr *_*son 5 .net c#

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

Type[] interfaces = typeof(int[]).GetInterfaces();
Run Code Online (Sandbox Code Playgroud)

我很震惊地在列表中找到这两个:

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创建的.这不能在我的环境中编译:

System.Collections.Generic.IReadOnlyList<int> list = new int[3];
Run Code Online (Sandbox Code Playgroud)

名称空间'System.Collections.Generic'中不存在类型或命名空间名称'IReadOnlyCollection'(您是否缺少程序集引用?)

当我尝试这个:

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);
Run Code Online (Sandbox Code Playgroud)

count正如预期的那样等于3.这里发生了什么?

编辑:我不认为我的机器上安装了框架4.5:

编辑2:谢谢@ScottChamberlain,事实证明我确实安装了它.

Yac*_*sad 6

.NET 4.5是.NET 4的就地更新.这意味着虽然在Visual Studio中您无法IReadOnlyCollection<T>在针对.NET 4时引用,但如果安装了4.5更新,则运行时可以使用此类型.

尝试在没有.NET 4.5更新(即4.0)的环境中运行代码,代码将找不到接口类型.即,Type.GetType("System.Collections.Generic.IReadOnlyCollection`1...将返回null,并且typeof(int[]).GetInterfaces()不包含您提到的接口.

  • @MrAnderson 4.5 在注册表中仍然显示为 4.0,[您需要查看内部版本号](https://blogs.msdn.microsoft.com/rodneyviana/2014/12/23/identifying-the-net-version -you-are-running-2-0-4-5-4-5-1-or-4-5-2/) (2认同)