我可以覆盖c#中的属性吗?

时间:2015-09-14 07:38:13

标签: c# class override

我的班级有两个属性:

public bool this[string i]
public double this[string i]

然后,当我想给它们一个值时,有一个区别于它的错误。

 Class cl = new Class() ;
 cl["something"] = true; //error
 cl["something_else"] = 10.1; //error

有没有办法不向其中一个属性添加参数,只是覆盖它?

3 个答案:

答案 0 :(得分:2)

不可以,仅通过返回类型区分属性或方法。

索引器签名的规则在C#规范的“10.9索引器”部分中指定:

  

索引器的形式参数列表定义了索引器的签名(§3.6)。具体来说,索引器的签名由其形式参数的数量和类型组成。形式参数的元素类型和名称不是索引者签名的一部分   索引器的签名必须与同一类中声明的所有其他索引器的签名不同。

(我的重点)

从“3.6签名和重载”:

  

方法的签名包括方法的名称,类型参数的数量,以及每个形式参数的类型和种类(值,引用或输出),按从左到右的顺序考虑。出于这些目的,在形式参数类型中出现的方法的任何类型参数不是通过其名称来标识,而是通过其在方法的类型参数列表中的序号位置来标识。 方法的签名特别不包括返回类型,params修饰符   可以为最右边的参数或可选的类型参数约束指定。

(再次,我的重点)

此外,在同一章的底部:

  

另请注意,返回类型和params修饰符不是签名的一部分,因此不可能仅基于返回类型过载或者包含或排除params修饰符

(再次,我的重点)

在同一个类上拥有多个索引器的唯一方法是为它们提供不同的参数类型或不同数量的参数。

我的建议是做以下其中一项:

  • 切换到使用命名属性,如果您有多个
  • ,那么仅使用索引器获得的内容并不完全清楚
  • 将索引器封装到不同的对象中,以便您编写instance.Percentages["name"]instance.Flags["name"]。您不能在C#中为索引器命名,但可以使用从属性返回的另一个对象来公开它们。

答案 1 :(得分:2)

问题不在于使用,而是在声明中。看作返回类型不参与重载解析,那两个索引器(不是属性)具有相同的签名,因此程序将无法编译。

从C#规范的“3.6签名和重载”部分:

  

方法的签名包括方法的名称,类型参数的数量和类型   并按其从左到右的顺序考虑每个形式参数的种类(值,参考或输出)。   出于这些目的,在形式参数的类型中出现的方法的任何类型参数是   不是通过名称标识,而是通过方法的类型参数列表中的序号位置标识。 签名   一个方法具体不包括返回类型,可以为其指定的params修饰符   最右边的参数,也没有可选的类型参数约束。

您可能不得不使用普通的旧getter / setter(例如:bool GetStatus(string i) double GetPercentage(string i),或重新考虑您的设计。

答案 2 :(得分:0)

这不是有效的c#语法。 请查看此页面以获取有关如何覆盖c#属性的说明:https://stackoverflow.com/a/8447846/3905529