要回答的事情:
不要担心方差,因为所讨论的项目是
Array
而不是T[]
。多维数组的类似情况是 [ 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/