Type int[] 如何实现尚不存在的接口(对我而言)?
Posted
技术标签:
【中文标题】Type int[] 如何实现尚不存在的接口(对我而言)?【英文标题】:How can Type int[] implement interfaces that do not yet exist (for me)? 【发布时间】:2016-11-03 04:42:04 【问题描述】:今天我在 Visual Studio 2010(.NET Framework 4.0 版)中测试了以下代码
Type[] interfaces = typeof(int[]).GetInterfaces();
我很震惊地发现这两个在名单上:
System.Collections.Generic.IReadOnlyList`1[[System.Int32, mscorlib, 版本=4.0.0.0,文化=中性,PublicKeyToken=b77a5c561934e089]], mscorlib,版本=4.0.0.0,文化=中性, PublicKeyToken=b77a5c561934e089
System.Collections.Generic.IReadOnlyCollection`1[[System.Int32, mscorlib,版本=4.0.0.0,文化=中性, PublicKeyToken=b77a5c561934e089]],mscorlib,版本=4.0.0.0, 文化=中立,PublicKeyToken=b77a5c561934e089
我之前在安装了框架 4.5+ 的环境中使用过这两个接口,根据文档,bothof 它们是为 4.5 创建的。这不在我的环境中编译:
System.Collections.Generic.IReadOnlyList<int> list = new int[3];
类型或命名空间名称“IReadOnlyCollection”不存在于 命名空间“System.Collections.Generic”(您是否缺少程序集 参考?)
当我尝试这个时:
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,事实证明我确实安装了它。
【问题讨论】:
new System.Collections.Generic.IReadOnlyList<int>();
正在尝试新建一个接口;无论 .NET 版本如何,这永远不会编译。
@MetroSmurf 谢谢...durp
关于您的编辑:请参阅 To find .NET Framework versions by viewing the registry (.NET Framework 4.5 and later) 了解如何检查高于 4.0 的版本。
另见Identifying the .NET version you are running (2.0, 4.5, 4.5.1 or 4.5.2)
【参考方案1】:
.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()
将不包含您提到的接口。
【讨论】:
我不相信我的机器上安装了 4.5 - 请参阅问题补充 @MrAnderson 4.5 在注册表中仍显示为 4.0,you need to look at the build number【参考方案2】:您正在为 .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 在很大程度上是向后兼容的,并且将简单地使用该运行时环境。
【讨论】:
我不相信我的机器上安装了 4.5 - 请参阅问题补充以上是关于Type int[] 如何实现尚不存在的接口(对我而言)?的主要内容,如果未能解决你的问题,请参考以下文章