2010-05-27 3 views
6

가상 메서드가 포함 된 다른 클래스 (클래스 A)를 상속하는 클래스 (클래스 B)가 있습니다.모호한 가상 메서드가있을 때이 C# 코드가 제대로 컴파일되는 이유는 무엇입니까?

public class ClassA{ 
    public virtual void TestMethod(){ 
    } 
} 

클래스 B

public class ClassB : ClassA{ 
    public void TestMethod(){ 
    } 
} 
클래스 B.있는 (예상되는) 덮어 방법을 선언 할 때

실수로는, I는 override 키워드를 생략

문제없이 컴파일 된 코드입니다. 왜 그 이유를 설명 할 수 있습니까?

+1

경고가 켜져 있습니까? – zildjohn01

+0

경고가 해제되었습니다 - 다시 지금 다시 설정하십시오 :) – Jimbo

답변

7

모호하지 않습니다. "new"또는 "override"를 지정하고 기본값이 효과적으로 "new"로 지정되어야한다는 경고와 함께 컴파일해야합니다.

코드를 컴파일하려고 할 때 "괜찮습니다"라고 컴파일하고 "문제없이"경고를 무시한다고 명확하게 경고합니다.

+0

실제로 경고가 표시되지 않습니다. 감사합니다. 다시 경고를 표시합니다. – Jimbo

+0

이 경우에'new' 메소드의 범위는 무엇입니까? 'override'가 본래의 메소드를 본질적으로 중단하면,'new'는 그 메소드에 대한 액세스 레벨을 생성해야합니까? – Jimbo

+0

@ 짐보 (Jimbo) : 여기에 실제로 어떤 용어를 사용하고 있는지 모르겠습니다. "중단"및 "액세스 수준"은 여기에 실제로 적용되지 않습니다. 그러나 기본적으로'ClassA'의 컴파일 타임 타입을 가진 참조에서'TestMethod'를 호출하면 원래 메소드를 호출 할 것이고'ClassB'의 컴파일 타임 타입을 가진 참조를 사용하면 파생 된 클래스를 사용할 것입니다 방법. –

0

클래스 B는

public class ClassB : ClassA{ 
    public override void TestMethod(){ 
    } 
} 

해야하지만 무시하지 않고 컴파일 할 수 있습니다 - 그것은 의도 된 경우 당신이 새로운 키워드

public class ClassB : ClassA{ 
    public new void TestMethod(){ 
    } 
} 

에게 체크 아웃 this를 추가해야한다는 경고를 생성한다 더 많은 정보

+1

-1 : 그가 묻지 않은 것 –

+0

죄송합니다 - 잠시 후 답변을 수정합니다. –

1

C# 컴파일러는 경고를 생성합니다. 항상 '경고를 오류로'컴파일하도록 조언합니다.

관련 문제