在c#中重载[] []

toa*_*ven 2 c# operator-overloading

我正在建立一个基于树的数据结构并重载[]以便我可以说

node["key1", "key2", "key3"]
Run Code Online (Sandbox Code Playgroud)

返回其父级1,2和3级以上是具有这些键的节点的节点.节点在概念上映射到数据数组,所以我现在拥有的是这个函数:

node[keys...].SetValue(i, value)
Run Code Online (Sandbox Code Playgroud)

它设置节点数据中的第i个值.如果我能做到这一点会有什么好处:

node[keys][i] = value
Run Code Online (Sandbox Code Playgroud)

问题是,node [keys]返回一个节点,因此[i]索引尝试获取另一个节点.基本上我想要做的是重载"[] []"作为运算符,我不能.

有什么方法可以达到我想做的事情吗?

Meh*_*ari 14

注意:这个答案谈到实现类似的东西obj[a][b][c]...可以使用可变数量的括号.看起来这并不是OP想要的.

你不能直接超载.您应该从第一个索引器返回带有索引器的对象,以便您可以模拟此功能.
这有点难以模拟set但是可以做类似的事情:

public class Node<T> {
    public Node<T> this[string key] {
        get { return GetChildNode(key); }
        set {
            if (value is DummyNode<T>) {
                GetChildNode(key).Value = value.Value;
            } else {
                // do something, ignore, throw exception, depending on the problem
            }
        }
    } 
    public static implicit operator T(Node<T> value) {
        return value.Value;
    }
    private class DummyNode<T> : Node<T> {
    }
    public static implicit operator Node<T>(T value) {
        return new DummyNode<T> { Value = value };
    }
    public T Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

  • 实际上,没有[] []运算符.它总是只应用[]下一个对象,就像锯齿状数组一样. (3认同)
  • 事实上,从技术上讲,在C#中,[] _是一个运算符.你为什么认为它不是?(它不归类为_overloadable_运算符,但它被归类为运算符.) (2认同)