【问题标题】:C# Interface to allow array as parameter允许数组作为参数的 C# 接口
【发布时间】:2020-04-01 06:52:24
【问题描述】:

我的代码接受一个参数,它需要访问Lengthproperty 以及可以通过[index] 进行索引。当我运行以下代码时,调用传递数组的方法的最后一行编译失败:

Cannot convert type 'int[]' to 'IArrayLike<int>'

我的接口定义应该是接受数组以及提供Length 属性且可索引的其他类。

interface IArrayLike<T> {
    T this[int index] { get; set; }
    int Length { get; }
}

class SomeClass<T> where T : IComparable<T> {
    public static int SomeMethod(T item, IArrayLike<T> data) {
        // code
    }
}

int[] someArray = new int[5];
SomeClass.SomeMethod(123, someArray);

【问题讨论】:

  • 你想完成什么
  • 我正在处理既可以存在于原生数组(例如 int[])中的数据,也可以存在于大数据的“分页”数组中。分页类具有多维数组来存储大量数据,并且它实现了长度和索引以允许进行二进制搜索等操作,因此我需要能够使用数组或类的实例调用方法提供 Length 属性并且是可索引的。

标签: c# arrays interface


【解决方案1】:

要使其与数组一起使用,您应该创建一个显式运算符。例如:

public static explicit operator ArrayLike<T>(T[] array) => new ArrayLikeImplementation<T>(array);

确保还将 ArrayLikeImplementation 更改为方法实现中的特定类实现。

ArrayLike 应该是一个类,因为它也不能是一个接口。

来源:Microsoft Documentation

【讨论】:

  • 不错的方法,但界面的“新”行不通。
  • 我不是说它会,因为这段代码需要在一个特定的类中实现,所以你将用你想要的类型替换新的 IArrayLike 实现。谢谢你,我会编辑答案。
  • 这就是我得到的,“不允许用户定义的与接口之间的转换”
  • 因为您实际上无法做到这一点:P 您最好使用一个类,可能类似于抽象类。 stackoverflow.com/questions/2433204/…
  • 我是否应该将 int[] 包装到一个类中,以便能够调用此方法?我希望我能以某种方式定义一个接口,该接口将接受任何 IComparable 的本机数组,或实现该接口的类的实例。
猜你喜欢
  • 1970-01-01
  • 2014-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-19
  • 2012-02-14
  • 1970-01-01
相关资源
最近更新 更多