具有不同类型的C#索引器属性

时间:2018-08-20 11:44:00

标签: c#

是否可以使用不同类型的索引属性。 我尝试搜索此论坛,但是这个问题有点不同,因为我根本无法为索引属性指定名称。

那么怎么可能这样做(肯定编译器会抱怨): 一个属性返回一个对象,另一个数组。在Visual Basic中,这种类型是可能的,而在C#中是不可能的?

属性1:

private Point3d this[int index] {
    get {
        return this.m_Levels[this.m_NodeLevel[index]][index];
    }
    set {
        this.m_Levels[this.m_NodeLevel[index]][index] = value;
    }
}

属性2:

private Point3d[] this[int index] {
    get
    {
        return this.m_Levels[index];
    }
    set
    {
        this.m_Levels[index] = value;
    }
}

2 个答案:

答案 0 :(得分:2)

使用相同的签名是不可能的。编译器应如何知道您调用哪个索引器方法?您可能要使用第二个参数(例如节点级别的索引),然后编译器可以区分这两个调用。对于属性1,您可以使用以下代码。

EdgeNGramTokenFilter

您始终可以使用带有名称的函数(例如private Point3d this[int nodeLevel, int index] { get { return this.m_Levels[this.m_NodeLevel[nodeLevel]][index]; } set { this.m_Levels[this.m_NodeLevel[nodeLevel]][index] = value; } } )来代替索引器。

答案 1 :(得分:0)

正如@slfan所说,您不能为this属性提供两个相同的签名。


据您所知,您可以进行转换

public int this[int index]
{
    get
    {
        return this.m_array[index];
    }
    set
    {
        this.m_array[index] = value;
    }
}

具有翻译

public int get_Item(int index)
{
    return this.m_array[index];
}

public void set_Item(int index, int value)
{
    this.m_array[index] = value;
}

使其更小:

int this[int index] { get { ... } }

等于(等于?

int get_Item(int index) { ... }

以与您可以相同的方式:

int get_Item(int index) { ... }
int get_Item(byte index) { ... }
int get_Item(float index) { ... }
int get_Item(string index) { ... }

可以也可以这样做:

int this[int index] { get { ... } }
int this[byte index] { get { ... } }
int this[float index] { get { ... } }
int this[string index] { get { ... } }

的操作方式与您无法进行此操作的方式相同:

public int get_Item(int index) { ... }
public int get_Item(int index) { ... } // <-- error

否:

public int get_Item(int index) { ... }
public float get_Item(int index) { ... } // <-- error

无法做到这一点:

int this[int index] { get { ... } }
int this[int index] { get { ... } } // <-- error

否:

int this[int index] { get { ... } }
float this[int index] { get { ... } } // <-- error