gpt4 book ai didi

c# - 如何使用不同的 set 和 get 重载 [] 运算符?

转载 作者:太空宇宙 更新时间:2023-11-03 12:59:18 25 4
gpt4 key购买 nike

我想使用不同的方法来实现各自的 get 和 set 情况,如下所示:

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

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

这会导致错误 CS0111:类型“Foo”已经用相同的参数类型定义了一个名为“this”的成员

这个功能似乎无法通过简单的方式实现。有解决方法吗?

我想像这样使用它:

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;

最佳答案

索引器重载是一个接受参数的特殊属性。在 VB.NET 中,由于 VB 处理集合的方式,该属性被赋予名称 Item(...) .如果您查看 IList<T> 的界面你会注意到它叫做 Item还有。

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

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

您的示例试图实现一种类型二元性,这不是索引器的意图,也无法在 .NET 类型系统中实现。类型不能同时是 Action和一个 string .它违背了基本的面向对象原则,试图将某事变成两件事。

如果你想将一个 Action 和一个字符串相关联,你应该创建一个类型来实现这一点:

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 的索引器实例和一切都变得更有意义。

关于c# - 如何使用不同的 set 和 get 重载 [] 运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32883228/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com