我可以在c#中重写属性吗?
我在班上有两处房产:我可以在c#中重写属性吗?,c#,class,overriding,C#,Class,Overriding,我在班上有两处房产: public bool this[string i] public double this[string i] 然后,当我想给它们一个值时,在区分它时会有一个错误 Class cl = new Class() ; cl["something"] = true; //error cl["something_else"] = 10.1; //error 有没有一种方法可以不向其中一个属性添加参数而直接重写它 否,无法仅通过返回类型来区分属性或方法 索引器的签名规则在“
public bool this[string i]
public double this[string i]
然后,当我想给它们一个值时,在区分它时会有一个错误
Class cl = new Class() ;
cl["something"] = true; //error
cl["something_else"] = 10.1; //error
有没有一种方法可以不向其中一个属性添加参数而直接重写它 否,无法仅通过返回类型来区分属性或方法 索引器的签名规则在“10.9索引器”部分的C#规范中规定: 索引器的形式参数列表定义了索引器的签名(§3.6)。具体而言,索引器的签名由其形式参数的数量和类型组成。元素类型和形式参数的名称不是索引器签名的一部分。
索引器的签名必须不同于同一类中声明的所有其他索引器的签名。 (我的重点) 从“3.6签名和重载”: 方法的签名由方法的名称、类型参数的数量以及每个形式参数的类型和种类(值、引用或输出)组成,按从左到右的顺序考虑。出于这些目的,在形式参数的类型中出现的方法的任何类型参数都不是通过其名称来标识的,而是通过其在方法的类型参数列表中的顺序位置来标识的方法的签名不包括返回类型,即params修饰符 可以为最右边的参数或可选类型参数约束指定。 (再次强调) 此外,在同一章的底部: 另外,请注意,返回类型和参数修饰符不是签名的一部分,因此不能仅基于返回类型或包含或排除参数修饰符来重载 (再次强调) 在同一个类上拥有多个索引器的唯一方法是为它们提供不同的参数类型或不同数量的参数 我的建议是采取以下措施之一:
- 切换到使用命名属性,如果您有多个索引器,则不完全清楚仅使用索引器会得到什么
- 将索引器封装到不同的对象中,以便编写
和实例.百分比[“name”]
。不能在C#中命名索引器,但可以使用从属性返回的另一个对象公开它们实例.标志[“name”]
索引器的签名必须不同于同一类中声明的所有其他索引器的签名。 (我的重点) 从“3.6签名和重载”: 方法的签名由方法的名称、类型参数的数量以及每个形式参数的类型和种类(值、引用或输出)组成,按从左到右的顺序考虑。出于这些目的,在形式参数的类型中出现的方法的任何类型参数都不是通过其名称来标识的,而是通过其在方法的类型参数列表中的顺序位置来标识的方法的签名不包括返回类型,即params修饰符 可以为最右边的参数或可选类型参数约束指定。 (再次强调) 此外,在同一章的底部: 另外,请注意,返回类型和参数修饰符不是签名的一部分,因此不能仅基于返回类型或包含或排除参数修饰符来重载 (再次强调) 在同一个类上拥有多个索引器的唯一方法是为它们提供不同的参数类型或不同数量的参数 我的建议是采取以下措施之一:
- 切换到使用命名属性,如果您有多个索引器,则不完全清楚仅使用索引器会得到什么
- 将索引器封装到不同的对象中,以便编写
和实例.百分比[“name”]
。不能在C#中命名索引器,但可以使用从属性返回的另一个对象公开它们实例.标志[“name”]
- 问题不在于用法,而在于声明。由于返回类型不参与重载解析,这两个索引器(不是属性)具有相同的签名,因此程序不会编译
根据C#规范第3.6节“签名和过载”:
方法的签名由方法的名称、类型参数的数量和类型组成
以及每个形式参数的种类(值、引用或输出),按从左到右的顺序考虑。
出于这些目的,在形式参数类型中出现的方法的任何类型参数都是
不是通过其名称标识,而是通过其在方法的类型参数列表中的顺序位置标识签名
方法的属性不包括返回类型,即可能为
最右边的参数,也不是可选的类型参数约束
您可能不得不退回到使用普通的旧getter/setter(例如:
bool-GetStatus(string i)
double-GetPercentage(string i)
,或者重新考虑您的设计。问题不在于使用,而是