我有一个带有索引器的类:
public class SpecialArray<T>
{
public T this[long index]
{
get { return SpecialGetFunction(index) }
set { SpecialSetFunction(index, value); }
}
private void SpecialSetFunction(long index, T value) { ...blah blah... }
private T SpecialGetFunction(long index) { ...blah blah... }
}
我有另一个当前有数组的类:
public class BaseClass<T>
{
private T[] _actual_nodes;
public virtual T[] Nodes
{
get { return _actual_nodes; }
set { _actual_nodes = value; }
}
}
现在我想覆盖BaseClass<T>
,因此它将使用我的索引类,而不是_actual_nodes
数组。
public class SomeDerivedClass<T> : BaseClass<T>
{
private SpecialArray<T> _new_nodes_array;
public override T[] Nodes
{
get { return _new_nodes_array; }
set { _new_nodes_array = value; }
}
}
不幸的是,这最后一个类会生成编译器错误,说明它无法隐式地从类型SpecialArray<T>
转换为T[]
(反之亦然)
所以我只是不确定如何使get / set语句使用我的索引类,而不是数组。起初我想知道是否有参考传递给“节点”的get / set的索引?但是,即使有,使用它仍然只允许我获取/设置单个T元素,而不是T[]
的数组。
问题:
任何人都有关于如何使被覆盖的T[] Nodes{}
访问者使用我的索引类获取/设置值的想法?
更多学术上,WHY不是索引器,返回/接受X类型的变量,IMPLY转换为X类型的数组?可以以某种方式明确定义这样的转换吗?
约束:我无法对BaseClass
进行更改。
答案 0 :(得分:1)
如果您可以转换为T[]
,则使用转换运算符:
public class SpecialArray<T>
{
public static explicit operator SpecialArray<T>(T[] array) { /* conversion logic here */ }
public static explicit operator T[](SpecialArray<T> array) { /* conversion logic here */ }
// the rest of class here
}
public class SomeDerivedClass<T> : BaseClass<T>
{
private SpecialArray<T> _new_nodes_array;
public override T[] Nodes
{
get{ return (T[])_new_nodes_array; }
set{ _new_nodes_array= (SpecialArray<T>)value; }
}
}
为什么没有索引器,返回/接受X类型的变量, IMPLY转换为X类型的数组?
Indexer只是这两种方法的语法糖:
T get_Item(long index);
void set_Item(T value, long index);
我无法想象,如何将其转换为数组。
答案 1 :(得分:0)
为什么没有索引器,返回/接受类型X的变量,IMPLY转换为类型X的数组
因为除了使用索引器之外,数组还可以执行某些操作。例如,您可以询问一个长度。具有索引器的类也可以具有数组不具有的功能,因此您不能使用索引器将任何类隐式转换为数组。
看起来你想要做的是能够添加给定泛型参数具有索引器的泛型约束。 你不能那样做。它不是语言的一个特征,与you can't add a generic constraint that a class overloads any other operator的方式大致相同。
如果您个人知道如何将T
类型的数组转换为类型SpecialArray
的{{1}},那么您可以在SomeDerivedClass的get / set方法中自行提供转换。索引器(或调用其他地方的实现)。根据您对如何将一种类型转换为另一种类型的个人知识,这需要完全明确。它不可能是隐含的。