我想使用不同的方法来实现相应的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;
答案 0 :(得分:1)
indexer重载是一个接受参数的特殊属性。在VB.NET中,由于VB处理集合的方式,该属性的名称为Item(...)
。如果您查看IList<T>
的界面,您会发现它也被称为Item
。
因此,它必须遵循与属性和方法重载相同的规则。方法的返回类型不被视为其调用签名的一部分,因此重载决策(编译器如何决定调用哪个版本的方法)无法区分索引器实现之间的差异。
索引器的目的是提供对存储在类似集合的对象中的值的访问。如果您可以获取并设置与给定键或索引关联的值,则期望您应该返回与设置相同的值。
您的示例正在尝试实现一种类型二元性,这不是索引器的意图,并且在.NET类型系统中无法实现。类型不能同时为Action
和string
。它反对基本的面向对象的主体,试图使某事成为两件事。
如果要关联操作和字符串,则应创建一个仅执行此操作的类型:
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
个实例的索引器,而且一切都更有意义。