【问题标题】:Why can't an indexable type be passed as an array c#为什么不能将可索引类型作为数组传递c#
【发布时间】:2015-08-14 23:21:58
【问题描述】:

例如,如果我有

class Foo{
    public float this[
        int index
    ] { get ...; set ...; }

}
....
void Bar(float[] array){...}

为什么我不能这么说?

 Bar(new Foo());

有没有办法将可索引类型作为索引类型的数组传递给方法?

【问题讨论】:

  • 没有。你想做的是鸭式打字,而c#不支持它。
  • 它有一个索引器,但这并不能使它成为一个数组。
  • float[] 永远不会与Foo 具有相同的类型——这是不可能的。
  • 其实我认为这是一个公平的问题。是否有可以实现的 IArray 接口,以便可以代替“真实”数组传递?我(认为)知道没有,但它不是一个不可能的功能,实际上会很有用
  • @MarcinJuraszek 这将是不完整的鸭子打字...... Length 属性在哪里?数组必须能够自我描述。但是是的......“鸭子打字”是这里正在走的路。

标签: c# indexing


【解决方案1】:

这是一个巨大的错误。索引器是不是数组。所以你不能这样作弊。我知道数组有索引器,但它们的索引器有一个int 类型的参数。如果您制作另一个类型为Foo 的索引器怎么办?这没有任何意义。

要真正使Foo 类似于数组,请实现一些接口。例如,IEnumerable<float>IEnumerator<float>

现在在您的Bar 方法中,将参数类型更改为IEnumerable<float>。现在,您可以传递 Foo 对象或 floats 数组。

有关如何实现IEnumerable 接口的信息,请参阅

https://msdn.microsoft.com/en-us/library/9eekhta0(v=vs.110).aspx

您可以在“示例”部分看到它。

【讨论】:

  • 为了让它像数组一样,他需要实现IList<T> 接口。它是唯一具有索引器的接口(连同IList 接口)。即使这样也不会将其对象转换为数组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-16
  • 2011-10-27
  • 2017-08-31
  • 2021-08-13
  • 1970-01-01
相关资源
最近更新 更多