可以为空的枚举不包含错误

时间:2015-11-11 11:38:18

标签: c# asp.net enums nullable

我想将我的枚举创建为可空,而不是添加默认值为0的默认条目。

但是,在以下情况中,我会遇到语法错误,我无法理解为什么,或者目前如何修复它。它可能很简单,但最简单的事情......

在这里,我的属性将枚举视为可以为空:

public Gender? Gender { get; private set; }

public MaritalStatus? MaritalStatus { get; private set; }

这是一个给我语法错误的方法,即性别不包含...,MaritalStatus不包含...:

    string GetTitle()
    {
        if (Gender == null || MaritalStatus == null)
            return null;
        if (Gender == Gender.M) // Error here!
            return "Mr";
        else if (
            MaritalStatus == MaritalStatus.Married ||
            MaritalStatus == MaritalStatus.Separated ||
            MaritalStatus == MaritalStatus.Widowed) // Error here!
            return "Mrs";
        else
            return "Ms";
    }

任何建议表示赞赏。

1 个答案:

答案 0 :(得分:4)

您有枚举MaritalStatusGender。同时,您拥有名为MaritalStatusGender的属性。你需要避免这种情况。

这里:

if (Gender == Gender.M)
if (MaritalStatus == MaritalStatus.Married)

语法不正确,因为GenderMaritalStatus被识别为变量,但不是类型。
此外,您需要使用.Value来访问值Nullable

因此,您可以明确指定命名空间:

if (Gender.Value == YourNamespace.Gender.M)
if (MaritalStatus.Value == YourNamespace.MaritalStatus.Married)

但我强烈建议您将您的枚举重命名为GenderEnumMaritalStatusEnum

为什么会这样?

这个问题可以在这里重现:

enum SameName { Value }
class Tester
{
   void Method1() {
      SameName SameName;
      SameName test = SameName.Value; // Works!
   }
   void Method2() {
      string SameName;
      SameName test = SameName.Value; // Doesn't work! Expects string method Value
   }
}

this answer Eric Lippert描述了这个原因:

  

C#被设计为在名称与其类型相同的属性面前是健壮的,因为这很常见:

class Shape
{
    public Color Color { get; set; }
    ...
  

如果你有一个Color类型,那么拥有一个名为Color的属性是很常见的,并且没有好的方法来重命名它们。因此,C#旨在合理地优雅地处理这种情况。

因此,如果您的变量属于Enum类型,则它引用枚举成员; else - 它指的是变量。 Enum?属于"其他"。