나는 무슨 일이 일어나고 있는지 이해하지 못한다는 것을 이해하기 시작했습니다. 그것은상속 된 클래스의 메서드 오버로드
public void Method(B a)
대신
public void Method(D a)
그것은 놀라운 인쇄됩니다
public class Base
{
public void Method(D a)
{
Console.WriteLine("public void Method(D a)");
}
}
public class Derived: Base
{
public void Method(B a)
{
Console.WriteLine("public void Method(B a)");
}
}
public class B { }
public class D: B { }
class Program
{
static void Main(string[] args)
{
Derived derived = new Derived();
D d = new D();
derived.Method(d);
}
}
: C#에서 다음과 같은 문제가있다. 이 동작의 이유는 메소드 테이블의 구현이라고 생각합니다. CLR은 현재 형식에서 해당 메서드를 찾으면 기본 클래스의 메서드를 검색하지 않습니다. 나는 그들이 성과를 향상 시키려고 노력하고 있다고 생각한다. 이
public void Method(B a)
대신
public override void Method(D a)
그것은 끔찍한 매우 unpred의 인쇄됩니다
public class Base
{
public virtual void Method(D a)
{
Console.WriteLine("public void Method(D a)");
}
}
public class Derived: Base
{
public override void Method(D a)
{
Console.WriteLine("public override void Method(D a)");
}
public void Method(B a)
{
Console.WriteLine("public void Method(B a)");
}
}
public class B { }
public class D: B { }
class Program
{
static void Main(string[] args)
{
Derived derived = new Derived();
D d = new D();
derived.Method(d);
}
}
과 :
는하지만 난 다음 코드로 완전히 실망했다 상상할 수있는.누구든지 설명 할 수 있습니까?
메서드 테이블에 현재 형식 (오버라이드 메서드 제외)으로 만 구현 된 메서드가 있고 호출 할 수있는 메서드를 찾자 마자 CLR이 해당 메서드를 찾는 것을 중지한다고 가정합니다. 내가 맞습니까?
메소드 테이블에서 메소드가 호출 된 특정 유형의 시그니처가있는 메소드를 찾고 있는데 상속에 따라 d가 b이기 때문에 일치를 찾습니다.이 메소드는 무시 된 메소드를 무시합니다. –
@EhsanSajjad 질문 * 왜 * 다른 것보다 과부하를 선택하는 이유입니다. 둘 다 유효한 메서드 호출이지만 컴파일러는 다른 메서드를 하나씩 선택합니다. – Servy
'호출 할 수있는 메소드가 발견되는 즉시 CLR은 해당 메소드를 찾지 않습니다. 내가 맞습니까? '이것은 CLR과 아무 관련이 없습니다. 이것은 런타임에 의한 결정이 아닌 C# 사양에 기반한 C# 컴파일러의 전체 컴파일 시간 결정입니다. – Servy