C#中的属性名和方法名可以相同吗? [复制]

Posted

技术标签:

【中文标题】C#中的属性名和方法名可以相同吗? [复制]【英文标题】:Can a property name and a method name be same in C#? [duplicate] 【发布时间】:2013-03-09 11:17:22 【问题描述】:

我有一个包含属性的类:

public bool IsMandatory get;set;

现在我正在添加一个方法IsMandatory(string str)

public bool IsMandatory(string str)

  //return false;
  //return true;

我收到一个编译时错误

该类型已包含“IsMandatory”的定义

C#中的方法名和属性名不能相同吗?我们以不同的方式使用方法和属性,为什么会出现编译错误?

【问题讨论】:

如果编译器告诉你你不能,那么实际上在问什么?为什么不能? @TimRogers,是的,我在问为什么我们不能? 它怎么知道你要打电话给哪个? 有些编程语言确实允许这种事情,而且使用起来很糟糕。感谢 C# 编译器阻止您采用不良做法。 【参考方案1】:

这是一个编译器错误,因为如果名称可能相同会导致混淆。在某些情况下可能会导致歧义 - 例如,在使用 Action 委托等时,方法不需要有括号,以及在使用 var 时。

【讨论】:

编译器可以愉快地区分重载方法Set_IsMandatory(bool value)Set_IsMandatory(string value),如果属性只是syntactic sugar for the getter and setter methods,那么允许方法和属性共享相同名称似乎是合理的因为生成的签名不同?我没有看到您提到的“困惑”,也许您可​​以考虑扩展您的答案以帮助我理解? @Ben 考虑一个属性,P,它为采用一个参数的方法返回一个委托。现在考虑在同一个类中拥有一个名为P 的方法,它接受一个相同类型的参数。如果您要编写instance.P(x),那么您是调用P 方法还是通过属性P 调用委托将是模棱两可的。【参考方案2】:

简而言之:这是不允许的。成员名称(字段、属性和方法)必须是 独一无二。

【讨论】:

这个答案没有解释为什么以及何时。例如。允许方法重载。

以上是关于C#中的属性名和方法名可以相同吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

C#获取实体类属性名和值

C#如何获取实体类属性名和值?

实体类中的属性名和表中的字段名不一样,怎么办?

MyBatis学习总结——解决字段名与实体类属性名不相同的冲突(转载)

.net 中的 DCOM (C#)

源文件名和目标文件名相同怎么办