C# 枚举设置器和获取器

C# 枚举设置器和获取器,c#,enums,getter-setter,C#,Enums,Getter Setter,今天我本可以使用以下构造(不编译) 这有用吗 编辑-回应评论 说明: 我想要一种具有无法使用的首次值的方法。我有一个声音类,当创建时什么也没做。声音根据它的状态做不同的事情。该类可能被其他程序员使用。一旦它录制或播放了,它就永远不会返回到“无”。我不希望intellisense在它不是一个选项时提示None。从C#7开始,我们可以对属性执行此操作 public string str {get; private set;} = "First time only"; 我意识到这可以通过像

今天我本可以使用以下构造(不编译)

这有用吗

编辑-回应评论

说明:

我想要一种具有无法使用的首次值的方法。我有一个声音类,当创建时什么也没做。声音根据它的状态做不同的事情。该类可能被其他程序员使用。一旦它录制或播放了,它就永远不会返回到“无”。我不希望intellisense在它不是一个选项时提示None。从C#7开始,我们可以对属性执行此操作

public string str {get; private set;} = "First time only";
我意识到这可以通过像

    public RecordedOrPlayed recordedOrPlayed
    {
        get { return _recordedOrPlayed; }
        set
        {
            if (value == RecordedOrPlayed.None)
                throw new ArgumentException("yada yada");
            _recordedOrPlayed = value;
        }
    } 

…但它很难看,很难一目了然,添加了另一个变量,需要10行代码来替换setter。

截至20分钟,有8人投了反对票,因此我认为这个问题不是由我回答的,而是由大众意见回答的。这可能不会包含在C#8中

同时,这个问题和另一个问题导致我被禁止再问更多的问题。我意识到这是一个由我的同龄人组成的陪审团,但我并不认为这个问题如此令人发指,以至于有理由进行惩罚

枚举只是带有标签的常量整数值

所以

最终将编译为

public const int RecordedOrPlayed_None = 0;
public const int RecordedOrPlayed_Recorded = 1;
public const int RecordedOrPlayed_Played = 2;
您试图通过使用实现的功能永远不会编译成您与getter和setter讨论的那种行为,因为它根本不是枚举的设计目的

这种严重的误解是你所有的反对票的来源

您的建议是对IntelliSense隐藏
enum
,这相当于说,隐藏
public const
。。。你可以理解为什么人们不理解你的问题


你在问什么<代码>枚举值是常量。您是说更改特定枚举常量的基础整数值会很有用吗?我怀疑你会在这方面找到很多共识。如果您需要类似的内容,我将创建一个包含
int
属性
None
录制的
播放的
,等等的类。您的代码无法编译,因为语法和用法明显错误(如您所述)。你的问题也不清楚…@BobKaufman你们都是对的。我意识到做同一件事有多种方法,但这并不能解决智能感知问题。我可以用一个布勒?或者int?,一个带有访问器的结构,或者其他一些乍一看就很难理解的迂回代码。看见above@svek见上文,每次只能通知一人comment@Paulustrious-请访问我们的帮助页面。在您的评论中,用反勾号(美国QWERTY键盘上未移动的波浪号“~”)分隔关键词。“bool?还是int?”是模棱两可的<代码>布尔值
?和
bool?
的意思不同。前者是一个问题的结尾,后者是
Nullable
的缩写,我理解,但它可以用各种方式完成,并且是有效的语法。Timedout@Svec我理解,但它可以以各种方式完成,并且是有效的语法,例如
{[EnumNoSet]None[EnumSet(ie default)]录制、播放}
编译器可以做任何它想做的事情。查看当您有
Task RecordAsync()…返回“Ignore”
时,它如何处理返回值;顺便说一句,我对这个问题的措辞非常简短,这样就不会推我的“为什么”,让别人说出他们的“为什么”和“为什么不”。这是一个错误。对于BobK,我将阅读帮助。@Paulustrious那么为什么不使用返回枚举的工厂模式呢?它似乎能满足你的要求,我没想到。另一个可能使用的语法错误是
public const int RecordedOrPlayed\u None=>1。如果编译器生成了
publicstatic int-RecordedOrPlayed\u-None=>0,则可以进行编译这并不重要,因为有很多解决方法。谢谢你的贡献。非常感谢
public enum RecordedOrPlayed
{
    None,
    Recorded,
    Played
}
public const int RecordedOrPlayed_None = 0;
public const int RecordedOrPlayed_Recorded = 1;
public const int RecordedOrPlayed_Played = 2;