如何使用distinct set和get来重载[]运算符?

时间:2015-10-01 08:49:06

标签: c# .net operator-overloading

我想使用不同的方法来实现相应的get和set案例,如下所示:

public int this[int i]
{
    get { return i + 1; }
}

public string this[int i]
{
    set { }
}

这会导致error CS0111: Type 'Foo' already defines a member called 'this' with the same parameter types

似乎这种功能无法以天真的方式实现。有解决方法吗?

我想像这样使用它:

class It {
    string SomeProperty;
}

class Bar {
    Action this[string key] {
        set {
            // ...
        }
    }
    string this[string key] {
        get {
            return new It ();
        }
    }
}

Bar ["key"] = () => {};
Bar ["key"].SomeProperty = 5;

1 个答案:

答案 0 :(得分:1)

indexer重载是一个接受参数的特殊属性。在VB.NET中,由于VB处理集合的方式,该属性的名称为Item(...)。如果您查看IList<T>的界面,您会发现它也被称为Item

因此,它必须遵循与属性和方法重载相同的规则。方法的返回类型不被视为其调用签名的一部分,因此重载决策(编译器如何决定调用哪个版本的方法)无法区分索引器实现之间的差异。

索引器的目的是提供对存储在类似集合的对象中的值的访问。如果您可以获取并设置与给定键或索引关联的值,则期望您应该返回与设置相同的值

您的示例正在尝试实现一种类型二元性,这不是索引器的意图,并且在.NET类型系统中无法实现。类型不能同时为Actionstring。它反对基本的面向对象的主体,试图使某事成为两件事。

如果要关联操作和字符串,则应创建一个仅执行此操作的类型:

public class NamedAction
{
    private readonly Action _action;
    public string Name { get; }

    public NamedAction(Action action, string name)
    {
        _action = action;
        Name = name;
    }

    public void Invoke()
    {
        _action.Invoke();
    }
}

现在你可以拥有一个获取和设置NamedAction个实例的索引器,而且一切都更有意义。