今天我在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,事实证明我确实安装了它.
.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()不包含您提到的接口.