2013-01-17 4 views
3

Enum VS 속성 이름 충돌에 대해 this, thisthis 개의 질문이 있습니다.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 
    } 
} 

I)의 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?Gender는 AS a를 this.Gender 재산의 읽기 및 Male로 해석된다되고, 이것이 당신이 Gender.Male을 쓸 때 컴파일러는 당신이 Nullable<Gender> 인스턴스 Male라는 속성에 대한 게터를 호출하려고 생각하는 것을 의미 Nullable<Gender>을 의미 그 결과로 Male이라는 속성을 읽습니다.

컴파일러는 enum이 메서드를 가질 수 없으므로 case (2)를 오류로 식별하지 않으므로 의미있는 해석 만이 열거 형 자체에 해당합니다.

당신은 이름 자격을 증가시켜이 문제를 해결할 수는 :

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

@Bobson을 : 내가 생각하는 내 왜 내가 그렇게 생각하는지 편집해라. –

+0

@Bobson :이 문제를 어떻게 해결할 수 있는지 보여주기 위해 편집했습니다. 사용중인 네임 스페이스에 맞게 조정하십시오. –

1

속성이나 지역 변수 타입/열거보다 우선 순위를 가지고,이 즉, 하나는 같은 이름의 변수 또는 속성을 선언하는 경우 type/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 
} 

이 규칙에 대한 유일한 예외이다. 널 (NULL) 타입이 둘러싸는 형태와 동일하지 그러나

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

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

대신 이름 Nullable<T>의 형태이며, 그 둘 사이 만 묵시적 캐스트 따라서 널 (NULL)의 경우에, 거기 컴파일러는 더 이상 열거 형 멤버 또는 정적 속성에 대한 액세스를 허용하지 않습니다. 유사한 방식으로

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 
}