2013-01-17 67 views
3

this,thisthis有关Enum VS Property name冲突的问题。C#Enum VS Nullable属性名称冲突

我的问题不是关于命名约定,而不是我想知道如何解决命名冲突在下面的代码所示:

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 
    } 
} 

如果我申报财产为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) 

它为什么会发生?

回答

6

Gender?意味着Nullable<Gender>,这意味着,当你写Gender.Male编译器认为你试图调用一个在Nullable<Gender>实例调用Male属性为getter,即Gender被interpretted作为this.Gender属性的读取和Male作为读取一个名为Male的属性。

编译器不会将case(2)识别为错误,因为枚举不能有方法,所以唯一有意义的分辨率就是枚举本身。

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

namespace Acme.Fruits.Banana 
{ 
    ... 
    public Person() 
    { 
     Gender = Banana.Gender.Male 
    } 
    ... 
} 
+0

@Bobson:我觉得我的编辑解释了为什么我认为这是如此。 –

+0

@Bobson:我已经编辑过,以展示如何解决这个问题。调整到您正在使用的命名空间。 –

1

的属性或局部变量的优先级高于类型/枚举,这意味着如果一个声明一个变量或属性与同名键入/ enum编译器将解析标识符的任何用法作为变量/属性。

public class Test 
{ 
    public static void SomeMethod(){} 
} 

public static void Main() 
{ 
    Test.SomeMethod();//ERROR... cannot use variable before declaring it. 
    object Test = new object(); 
    Test.SomeMethod();//ERROR... object does not have a method SomeMethod 
} 

唯一的例外是,如果属性/变量具有相同的名称作为自己的类型,在这种情况下,编译器允许它访问静态成员。

public class Test 
{ 
    public static void SomeMethod(){} 
} 

public static void Main() 
{   
    Test Test = new Test(); 
    Test.SomeMethod();//Works 
} 

然而空类型是不一样的,因为它包围的类型,而不是名称是在Nullable<T>形式,并且只有在两者之间的隐式转换,因此在可为空的情况下编译器将不再允许访问枚举成员或静态属性。

public struct Test 
{ 
    public static void SomeMethod(){} 
} 

public static void Main() 
{   
    Test? Test = new Test(); 
    Test.SomeMethod();//ERROR... Test does not have method SomeMethod 
} 

以类似的方式它必须是变量的类型declarion因为编译器必须对此,下面将不会如工作:

public class Test 
{ 
    public static void SomeMethod(){} 
} 

public static void Main() 
{   
    object Test = new Test(); 
    Test.SomeMethod();////ERROR... object does not have a instance method SomeMethod 
}