如何根据命名约定在C#中命名类型为Gender的Gender属性?

如何根据命名约定在C#中命名类型为Gender的Gender属性?,c#,enums,naming-conventions,C#,Enums,Naming Conventions,我有一个性别枚举: public enum Gender { Male, Female, Other, Unknown } 我在Person类中还有Gender属性: public Gender Gender { get; set; } 但我有一个错误: 类型“Person”已包含“Gender”的定义 将枚举放在类之外确实解决了这个问题,但我希望它放在类内部。我在中没有找到解决该特定问题的方法。是否有任何命名约定可以解决此类问题 注意:我不是在征求意见,我是

我有一个
性别
枚举:

public enum Gender
{
    Male,
    Female,
    Other,
    Unknown
}
我在
Person
类中还有
Gender
属性:

public Gender Gender { get; set; }
但我有一个错误:

类型“Person”已包含“Gender”的定义

将枚举放在类之外确实解决了这个问题,但我希望它放在类内部。我在中没有找到解决该特定问题的方法。是否有任何命名约定可以解决此类问题

注意:我不是在征求意见,我是在问这种情况是否有众所周知的命名约定

这些案例没有“众所周知的命名约定”。通过在使用它的类型之外定义类型(如错误消息所示),可以更好地处理这种不明确的命名

如果类型显式地是类型的API表面的一部分,那么将枚举定义为成员似乎很奇怪。

对于这些情况,没有“众所周知的命名约定”。通过在使用它的类型之外定义类型(如错误消息所示),可以更好地处理这种不明确的命名

如果类型显式地是某个类型的API表面的一部分,那么将枚举定义为成员似乎很奇怪。

没有“命名约定”可以解决您希望一个类型的两个成员共享相同名称的问题。根据C语言规范第10.3节,班级成员:

•常量、字段、属性、事件或类型的名称必须与同一类中声明的所有其他成员的名称不同

•方法的名称必须不同于同一类中声明的所有其他非方法的名称。此外,方法的签名(§3.6)必须不同于同一类中声明的所有其他方法的签名

(我的重点)

因此,您必须选择使用不同的名称,或者使用您显然已经放弃的选项,将枚举放置在
Person
类之外。或者,如果您确实想封装它,可以进一步封装它:

class Person {
   class Enums {
      enum Gender {
         ...
      }
      ...
   }
   Enums.Gender Gender {get;set;}
   ...
}
虽然我觉得这更难看。

没有“命名约定”可以解决您希望同一类型的两个成员使用相同名称的愿望。根据C语言规范第10.3节,班级成员:

•常量、字段、属性、事件或类型的名称必须与同一类中声明的所有其他成员的名称不同

•方法的名称必须不同于同一类中声明的所有其他非方法的名称。此外,方法的签名(§3.6)必须不同于同一类中声明的所有其他方法的签名

(我的重点)

因此,您必须选择使用不同的名称,或者使用您显然已经放弃的选项,将枚举放置在
Person
类之外。或者,如果您确实想封装它,可以进一步封装它:

class Person {
   class Enums {
      enum Gender {
         ...
      }
      ...
   }
   Enums.Gender Gender {get;set;}
   ...
}

尽管我认为这更丑陋。

正如已经说过的那样,这种情况没有命名约定。但据我记忆所及,C#准则不鼓励您使用内部类型定义,因为内部定义的类应该经常从外部访问。
我想说,最好在同一名称空间中定义
Gender
Enum
,因为性别是人的公共财产

如前所述,此类案例没有命名约定。但据我记忆所及,C#准则不鼓励您使用内部类型定义,因为内部定义的类应该经常从外部访问。

我想说,最好在同一名称空间中定义
Gender
Enum
,因为性别是人的公共财产

你的
是什么样子的?对你的问题,没有意见的答案是:不。@Ian-这只是一个例子。。。“我问一下大概的想法。”StefanSteinegger-谢谢。为什么现在把它放在一个答案里?:)@Sipo:对我来说似乎太琐碎了。你的
班是什么样子的?你问题的无意见答案是:不。@Ian-这只是一个例子。。。“我问一下大概的想法。”StefanSteinegger-谢谢。为什么现在把它放在一个答案里?:)@Sipo:对我来说似乎太琐碎了。谢谢。请演示第二个解决方案如何工作?@Sipo
public namespace.Person.Gender-Gender{get;set;}
“定义属性时完全限定类型名。”-我认为这行不通。只有当一个类型的多个成员都是方法名,并且通过签名进行适当区分时,才能使用相同名称的多个成员。@Sipo已修复,当然这不起作用(我指责缺乏咖啡因),amhbigity位于两个名称之间。谢谢。请演示第二个解决方案如何工作?@Sipo
public namespace.Person.Gender-Gender{get;set;}
“定义属性时完全限定类型名。”-我认为这行不通。只有当一个类型的多个成员都是方法名,并且通过签名进行适当区分时,才能使用相同名称的多个成员。@Sipo已修复,当然这不起作用(我指责缺乏咖啡因),amhbigity位于两个名称之间。添加类(可能应该是
静态的
)作为内部名称空间。我会一直将enum设置为非成员:作为公共接口的一部分,它应该(IMHO)在类似的范围内。内部类型用于帮助程序和实现细节。添加一个类(可能应该是
静态的
)作为内部名称空间绝对不合适。我会一直将enum设置为非成员:作为公共接口的一部分,它应该(IMHO)在类似的范围内。内部类型用于帮助程序和实现详细信息。