2011-04-08 6 views
0

MyClass에문자열뿐만 아니라 myClass가 예를 아래에으로 노력하고 있습니다.듀얼 자연

저는 모두가 라고 말합니다. 아래 예와 같이 사용하는 것이 좋지 않습니다..

CODE :

class myClass 
{ 
    public static void Main(string[] args) 
    { 
     string @myClass = "my-Class"; 

     myClass.Replace("-", " "); //myClass works as string 
     myClass ob = new myClass(); //myClass works as myClass 

     ob.i(); 
    } 
    public void i() 
    { 

    } 
} 

하지만 알고 싶어

  • 이는 컴파일러의 버그인가? 컴파일러로 경고를 제공해야합니다.
  • 컴파일러가이 이중 특성을 어떻게 관리합니까?
+0

내 눈! 하지만 +1, 지금은 내가 궁금 해서요 ... – Cameron

+0

컴파일러가 경고를주는 이유는 무엇입니까? 완전히 다른 두 가지 상황에서 myClass를 사용하고 있으며 컴파일러에 대한 모호성이 없습니다. –

+0

차이점은 컨텍스트입니다. 구문 분석기는 토큰이 객체인지 클래스인지 여부에 따라 컨텍스트를 기반으로 결정할 수 있습니다. –

답변

3

당신은 기본적으로 이상하게 보이는 것을하고 있지만 컴파일러는 컨텍스트를 기반으로 그것을 파악할 수 있습니다.

string @myClass = "my-Class"; 

이것은 myClass라는 문자열 변수를 선언합니다. 변수 이름에 @를 사용하면 일반적으로 허용되지 않는 이름 (예 : 키워드)으로 변수를 만들 수 있습니다. myClass는 키워드가 아니기 때문에 @는 필요하지 않지만 여전히 사용할 수 있습니다. 정보에 대해서는이 질문을보십시오 : What does the @ symbol before a variable name mean in C#?.

myClass.Replace("-", " "); 

myClass 변수에서 Replace 메서드 문자열이 호출됩니다.

myClass ob = new myClass(); 

"myClass"유형의 새 개체를 만듭니다. 컴파일러는 사용법에 따라 myClass를 사용하면 문자열 변수가 아니라 해당 유형을 참조 함을 알 수 있습니다. 당신도 @ 필요가 없습니다

1

아래 줄은 myClass 클래스가 아니라 @myClass 문자열로 정의한 문자열 변수를 나타냅니다.

myClass.Replace("-", " "); //myClass works as string 
+0

예, 그렇지만 컴파일시 이름 충돌이없는 이유는 무엇입니까? – Cameron

+0

하나는 유형이고 다른 하나는 지역 변수 이름입니다. 그건 합법이야. –

+0

@Chris : 아하! 너무 단순하고 명백한 것은 회상에서 흔히 속성을 유형과 동일한 이름으로 지정하는 경우입니다. 감사! – Cameron

0

첫 번째 @myClass는 인스턴스 또는 변수 이름이고 클래스 (유형) 이름 인 myClass와 충돌하지 않습니다.

오류 또는 경고가 표시되지 않습니다. 컴파일러는 그들이 당신은 문제가있는 것 충돌하는 경우에만, 두 사람 사이에 구별 할 수 있습니다 - -

1

당신은 유형뿐만 아니라 변수 이름으로 myclass를 사용하여 Main 방법에서 즉,이 컴파일러 오류를 만들 것을 :

myClass.Main(new string [1]); 
2

참고 :

string myClass = "my-Class"; 

은 위의 완벽 괜찮습니다.

당신 말 :

compiler should give warning. 

그것을해야합니까? 실제로 모호함이 없습니다.또한 유형의 이름으로 변수의 이름을 정말 드문

public class MyRandom 
{ 
    public Random Random { get; private set; } 

    public MyRandom() 
    { 
     // Is this ambiguous? No--the left HAS to be the property; 
     // the right HAS to be the type name. 
     Random = new Random(); 
    } 
} 

이 아니에요 :

이 꽤 일반적인 시나리오를 생각해 보자. 일부 멤버가 겹치는 경우에만 모호성이 있습니다. 예 :

public class MyThreadPool 
{ 
    public static void Add(Thread thread) 
    { 
     Console.WriteLine("Called the static method."); 
    } 
} 

public class SomeOtherClass 
{ 
    public List<Thread> MyThreadPool { get; private set; } 

    public SomeOtherClass() 
    { 
     MyThreadPool = new List<Thread>(); 
    } 

    public void DoSomethingAmbiguous() 
    { 
     // To me, it would make sense for the compiler to issue a warning here, 
     // as it seems rather ambiguous (to me at least). However, it doesn't, 
     // which tells me the behavior is defined somewhere in the spec (I'm too lazy 
     // to check). 
     MyThreadPool.Add(null); 
    } 
}