首页 >后端开发 >C++ >尽管缺少公共'Count”属性,C# 数组是否真正实现了'IList”接口?

尽管缺少公共'Count”属性,C# 数组是否真正实现了'IList”接口?

Susan Sarandon
Susan Sarandon原创
2025-01-05 20:14:41667浏览

Do C# Arrays Truly Implement the `IList` Interface Despite Lacking a Public `Count` Property?

C# 中的数组:破坏 IList接口实现?

问题:

C# 中的数组实现 IList但神秘地缺乏公共伯爵财产。这是否违反了接口实现规则?

答案:

数组和泛型接口

C# 中的数组实现System.Collections.IList,它不是通用的。它们不直接实现 System.Collections.Generic.IList 。因为它们不是通用的。

CLR 中的隐藏实现

但是,公共语言运行时 (CLR) 动态创建具体的数组类型。这些类型在内部使用 System.SZArrayHelper 类来实现 IList 。接口。

编译器和 CLR 知识

编译器和 CLR 知道数组类型并了解如何将它们转换为 IList。 CLR 提供了通过 SZArrayHelper 类访问底层数组对象的实现。

缺少 Count 属性

Count 属性未显式实现。相反,CLR 在内部使用映射到数组 Length 属性的方法:

internal int get_Count<T>() {
    T[] _this = JitHelpers.UnsafeCast<T[]>(this);
    return _this.Length;
}

违反规则?

这种内部实现可以说违反了严格的规则接口实现规则。然而,它为数组提供了一种方便且无缝的方式,使其表现得就像实现了 IList 一样。

其他见解

  • CLR 还有其他类型替换,例如 MapIList ;至IVector T在 WinRT 上下文中。
  • 将数组视为完全实现 IList 的抽象很方便,但在某些情况下可能会产生误导。
  • GetInterfaceMap() 方法不适用于泛型接口的具体数组类型,从而揭示了隐藏的实现。

以上是尽管缺少公共'Count”属性,C# 数组是否真正实现了'IList”接口?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn