为什么Array类没有直接暴露其索引器?

Ken*_*Kin 22 c# arrays ilist indexer

要回答的事情:

  1. 不要担心差异,而有问题的项目则Array不是T[].

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

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


题:

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

public static Array ToArray<T>(this T source); 
Run Code Online (Sandbox Code Playgroud)

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

public static IList ToArray<T>(this T source); 
Run Code Online (Sandbox Code Playgroud)

但我认为一个名为ToArrayreturn的方法IList看起来很奇怪.

因此,我对此感到困惑:

在声明中Array,有

object IList.this[int index];
Run Code Online (Sandbox Code Playgroud)

这样我们就可以

Array a;
a=Array.CreateInstance(typeof(char), 1);
(a as IList)[0]='a';
Run Code Online (Sandbox Code Playgroud)

但我们做不到

a[0]='a';
Run Code Online (Sandbox Code Playgroud)

除非它被宣布为

public object this[int index]; 
Run Code Online (Sandbox Code Playgroud)

我能看到的唯一区别是它需要我们通过IList实现它的接口显式地使用它的索引器,但为什么呢?有好处吗?或者是否存在暴露问题?

Ser*_*rvy 20

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

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

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

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

public static T[] ToArray<T>(this T source); 
Run Code Online (Sandbox Code Playgroud)

那将有一个索引器.

如果数组中的元素不是全部类型,T那么您可以返回object[]:

public static object[] ToArray<T>(this T source); 
Run Code Online (Sandbox Code Playgroud)

  • @KenKin听起来你需要先修改你的输入; 这种方法不应该存在.您的方法的调用者将没有有效的方法来知道返回的数组的类型是什么,因此他们无法有效地使用它.你应该有两个完全独立的方法,一个用于将一系列项目转换为数组(即LINQ的ToArray),另一个用于将单个项目转换为该项目的数组.您可以根据需要组合这两种方法,以便从特定调用者的角度获得所需的结果. (2认同)

Din*_*nah 5

a as IList是(基本上)铸造.所以先把它抛出来:

char[] a = (char[])Array.CreateInstance(typeof(char), 1);
a[0] = 'a';
Run Code Online (Sandbox Code Playgroud)

编辑:原因是:因为界面Array根本没有定义索引器.它使用SetValue(Object, Int32)Object GetValue(Int32).注意Object那里不祥的东西.Array不是特定类型的; 它是为最低标准而建的:Object.它可以很容易地定义一个索引器,但实际上你仍然有un/boxing问题.

  • 是的,但问题是,没有铸造它为什么不起作用? (2认同)