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)
为什么会这样?
Gender?意味着Nullable<Gender>,这意味着当您编写Gender.Male编译器时,您认为您正在尝试Male在Nullable<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)
| 归档时间: |
|
| 查看次数: |
455 次 |
| 最近记录: |