C# 在重写的成员数组内使用带有索引器的类';s存取器

C# 在重写的成员数组内使用带有索引器的类';s存取器,c#,inheritance,overriding,accessor,indexer,C#,Inheritance,Overriding,Accessor,Indexer,我有一个带索引器的类: public class SpecialArray<T> { public T this[long index] { get { return SpecialGetFunction(index) } set { SpecialSetFunction(index, value); } } private void SpecialSetFunction(long index, T value)

我有一个带索引器的类:

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... }
}
不幸的是,最后一个类生成了一个编译器错误,说明它不能隐式地从类型
specialray
转换为
T[]
(反之亦然)

所以我不知道如何让get/set语句使用我的索引类,而不是数组。起初,我想知道是否有任何方法可以引用传递给“节点”的get/set的索引?但是,即使有,使用它仍然只允许获取/设置单个T元素,而不是
T[]
的数组

问题
有人想过如何让被重写的
T[]节点{}
访问器使用我的索引类来获取/设置值吗

在学术上,为什么索引器返回/接受X类型的变量不意味着转换为X类型的数组?这样的转换可以以某种方式明确定义吗


约束:如果您可以转换到
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类型的变量)不意味着转换为X类型的数组


因为数组除了使用索引器之外还可以做其他事情。例如,你可以问一个长度。具有索引器的类也可以具有数组不具有的功能,因此不能将任何具有索引器的类隐式转换为数组或从数组中转换

看起来您想要做的是能够添加一个泛型约束,即给定的泛型参数有一个索引器。你不能那样做。这根本不是语言的一个特征,与之大致相同


如果您个人知道如何将
T
类型的数组转换为
T
类型的
SpecialRay
,那么您可以在SomeDerivedClass的索引器的get/set方法中自己提供这种转换(或者调用其他地方的实现)。这需要完全明确地基于您个人对如何将一种类型转换为另一种类型的了解。它不可能是隐式的。

“因为数组除了使用索引器之外还可以做其他事情。例如,你可以要求一个索引器提供它的长度。”;那么,我能否从IDontKnowWhatClass派生SpecialArray类,以实现使该类在各个方面都像数组一样的功能?@Glurth不,你不能。即使您提供了所有必要的组件(记录在案,您在物理上无法实现协方差,也就是说,您不能像数组那样实现协方差),编译器也无法验证您是否实现了所有必要的组件。同样,如果你创建了两个具有相同字段的类,你仍然不能隐式地将一个转换为另一个,你需要显式地定义如何将一个转换为另一个。该死,我也想将此标记为一个答案,这确实增强了Dennis提供的更技术性的答案,抱歉。@Glurth所以你真的需要有人为两个方法键入签名,将数组转换为你的类型并返回?在被告知这是你需要做的事情后,你自己也无法弄明白?我觉得…令人惊讶。不,先生。这篇文章的关键部分,我标记为答案,指出“Indexer只是这两种方法的语法糖……”。这似乎是主要的技术原因,我不能做我所尝试的。对不起,我不明白你所说的“被告知后……”是什么意思;他的文章是第一篇。“这就是你需要做的”:但我们认为这是不可能的,对吗?
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; } 
    }
}
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; }  
    }
}
T get_Item(long index);
void set_Item(T value, long index);