솔직히 묻습니다 (이 질문의 일부분) here 하지만 지금은 다른 관련 질문이 있습니다.공분산은 콘크리트 유형보다 높습니까?
public class Base
{
public void Foo(IEnumerable<string> strings) { }
}
public class Child : Base
{
public void Foo(IEnumerable<object> objects) { }
}
List<string> lst = new List<string>();
lst.Add("aaa");
Child c = new Child();
c.Foo(lst);
(N C# 3이 호출 : C# 4에 Base.Foo
그것이 호출 : Child.Foo
)를
임! 을 내가 c.Foo(lst);
쓸 때 -
는 모두 서명을 본다! (lst
는 STRING의 IEnumerable
입니다!), 공분산에 대한 모든 존경과
에 대해 이야기 할 수 있습니다 하지만 여전히 - IEnumerable<object>
??
콘크리트 유형 자체보다 공분산이 강합니까?
서명을 지정하여 강제로 방법 중 하나를 선택할 수 있습니다. 'c.Foo ((IEnumerable) lst)'상황에서 서명은 실제 구체적인 유형과 일치하지 않으므로 가정하지 않아야합니다. (아래의 대답은 3.0과는 다른 선택에 대한 이론적 근거를 제공하지만이 회색 영역에서는 캐스트로 동작을 명시 적으로 정의하는 것을 선호합니다) –
@jamietre, 아니요, 작동하지 않습니다. 코드는 여전히'Child' 메소드를 호출 할 것입니다. – svick
그럼 당신은 내 온 세상을 파괴했습니다! 물론입니다. 캐스트의 모호성을 제거하기 전에 "후보 방법 집합"이 축소 된 것처럼 보입니다. –