我经常发现自己实现了一个类来维护某种自己的状态属性作为枚举:我有状态类型的状态枚举和状态属性.我该如何解决这个名称冲突?
public class Car
{
public enum Status
{
Off,
Starting,
Moving
};
Status status = Status.Off;
public Status Status // <===== Won't compile =====
{
get { return status; }
set { status = value; DoSomething(); }
}
}
Run Code Online (Sandbox Code Playgroud)
如果Status enum对于不同的类型是通用的,我会把它放在课外,问题就会解决.但Status仅适用于Car,因此在类外声明枚举是没有意义的.
在这种情况下你使用什么命名约定?
注意:在回答这个问题的评论中,对这个问题进行了部分辩论.由于这不是主要问题,因此没有太多可见性.
编辑:Filip Ekberg建议IMO针对"状态"的具体案例提供出色的解决方法.然而,我很有兴趣阅读关于枚举/属性名称不同的解决方案,如Michael Prewecki的回答.
EDIT2(2010年5月):我最喜欢的解决方案是按照Chris S的建议复数枚举类型名称.根据MS指南,这应该仅用于标记枚举.但我越来越喜欢它了.我现在也将它用于常规枚举.
这里和这里有一些相关的问题,但它们并没有真正给我满意的答案.问题是嵌套在C#中的类的枚举不能与类的属性具有相同的名称.我的例子:
public class Card
{
public enum Suit
{
Clubs,
Diamonds,
Spades,
Hearts
}
public enum Rank
{
Two,
Three,
...
King,
Ace
}
public Suit Suit { get; private set; }
public Rank Rank { get; private set; }
...
}
Run Code Online (Sandbox Code Playgroud)
有一些选项可以解决这个问题,但它们对我来说似乎并不合适.
我可以在课堂外移动枚举,但是你只会说Suit而不是Card.Suit,这对我来说似乎不对.什么是Suit外界的背景Card?
我可以移动它们的类外,并将其更改为类似CardSuit和CardRank,但后来我觉得我在烤的上下文信息到枚举时,应该由一个类或命名空间名称进行处理的名称.
我可以改变枚举到的名字Suits和Ranks,但是这违反了微软的命名规则.它感觉不对劲.
我可以更改属性名称.但到了什么?我觉得直觉对我来说是对的Suit = Card.Suit.Spades.
我可以将枚举移动到一个单独的静态类中,该类CardInfo只包含这些枚举.如果我不能提出任何其他建议,我认为这是最好的选择.
所以我想知道其他人在类似的情况下做了什么.知道为什么不允许这样做也很好.也许埃里克·利珀特(Eric Lippert)或其他人可能会决定禁止它?它似乎只会在类中产生歧义,这可以通过强制使用this.Suit …
我正在尝试创建一个类型的常量Enum但是我得到一个错误..我的枚举是:
public enum ActivityStatus
{
Open = 1,
Close = 2
}
Run Code Online (Sandbox Code Playgroud)
我有一个使用它的模型:
public class CreateActivity
{
public int Id;
public const ActivityStatus ActivityStatus = ActivityStatus.Open;
}
Run Code Online (Sandbox Code Playgroud)
发生以下错误:
错误1"Help_Desk.Models.CreateActivity.ActivityStatus"常量值的评估涉及循环定义......
但是,如果我更改ActivityStatus属性的名称,它的工作原理!
public class CreateActivity
{
public int Id;
public const ActivityStatus AnyOtherName = ActivityStatus.Open;
}
Run Code Online (Sandbox Code Playgroud)
为什么会这样?
关于Enum VS Property名称冲突有这个,这个和这个问题.
我的问题不是关于命名约定,而是我想知道如何解决下面代码中演示的名称冲突:
namespace Test
{
public class Person
{
// 1)
// Gender? Gender { get; set; }
// 2)
Gender Gender { get; set; }
public Person ()
{
// 1 - Error CS1061: Type `Test.Gender?' does not contain a definition for `Male' and no extension method `Male' of type `Test.Gender?' could be found (are you missing a using directive or an assembly reference?) (CS1061) (Test)
// 2 - OK
Gender …Run Code Online (Sandbox Code Playgroud)