C#Enum VS Nullable属性名称冲突

Edu*_*lho 3 .net c# enums naming nullable

关于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 = Gender.Male;
        }
    }

    public enum Gender
    {
        Male = 1,
        Female
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我声明属性,如2)Gender Gender { get; set; }代码编译成功,但是,如果我声明如1)Gender? Gender { get; set; }(在上面的代码中注释)我得到错误

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)
Run Code Online (Sandbox Code Playgroud)

为什么会这样?

Pau*_*ane 6

Gender?意味着Nullable<Gender>,这意味着当您编写Gender.Male编译器时,您认为您正在尝试MaleNullable<Gender>实例上调用的属性上调用getter ,Gender即将其解释为对this.Gender属性Male的读取以及作为Male对其结果调用的属性的读取.

编译器不会将case(2)识别为错误,因为枚举不能有方法,所以唯一有意义的解决方案是符号本身就是枚举.

您可以通过增加名称限定来解决此问题:

namespace Acme.Fruits.Banana
{
    ...
    public Person()
    {
        Gender = Banana.Gender.Male
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)