c# - 为什么 Array 类不直接公开其索引器?

标签 c# arrays ilist indexer

要回答的事情:

  1. 不要担心方差,因为所讨论的项目是Array 而不是T[]

  2. 多维数组的类似情况是 [ here ]

也就是说,N-dims 到线性变换,总是可能的。所以这个问题特别引起了我的注意,因为它已经为线性索引器实现了 IList


问题:

在我的代码中,我有以下声明:

public static Array ToArray<T>(this T source); 

我的代码知道如何使 souce 呈现一个数组(在运行时)。我正试图让消费代码直接访问它的索引器。但如果没有“as IList”,它就无法完成。 要返回 object[] 可能需要额外的转换/转换,这就是我要阻止的事情。 我能做的是:

public static IList ToArray<T>(this T source); 

但我认为名为 ToArray 的方法返回一个 IList 看起来很奇怪。

因此,我对此感到困惑:

Array的声明中,有

object IList.this[int index];

这样我们就可以

Array a;
a=Array.CreateInstance(typeof(char), 1);
(a as IList)[0]='a';

但我们不能

a[0]='a';

除非它被声明为

public object this[int index]; 

我能看到的唯一区别是它要求我们通过实现它的接口(interface) IList 显式使用它的索引器,但为什么呢? 有好处吗?还是有暴露问题?

最佳答案

Array 不能有索引器,因为它需要能够表示具有任意维数的数组。二维数组的索引器与一维数组的索引器具有不同的签名。

如果在表示二维数组的 Array 上提供并使用了索引器,会发生什么情况?

语言设计者选择的解决方案是根本不包含索引器。

如果您知道您的 ToArray 方法将始终返回一维数组,那么请考虑使用:

public static T[] ToArray<T>(this T source); 

那会有一个索引器。

如果数组中的元素并非都是 T 类型,那么您可以返回一个 object[]:

public static object[] ToArray<T>(this T source); 

关于c# - 为什么 Array 类不直接公开其索引器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14533082/

相关文章:

c# - 如何在以下场景中使用线程或任务模式

php - PHP中未知数量的数组相交

f# - 你如何在 F# 中使用 IList<>?

c# - 组合表达式 c#

c# - 任何人都有示例代码,用于将一个网站的 "chunked"HTTP 流式下载直接上传到单独的 Web 服务器?

javascript - 使用下划线js对对象数组进行排序

php - 类似于 MySQLi 的 PDO 获取数组

c# - 为什么 C# 数组没有 Count 属性?

c# - 不可能在字典中返回 IEnumerable 的子类型

c# - EF : Include navigation property and exclude sub navigation property in same time