문제

몇몇 게시물에 이미 stack overflow 이런 종류의 물건에 대해지는 정확히 동일하게도록 사전에 죄송하는 경우 이것은 이미 대답했다.

왜 이 작동하지 않:

public class MyBase { }

public class MyUtils
{
    public bool Foo<T> (T myObject) { return true; }
    public bool Foo (MyBase myBaseObject) { return false; }

    public void Go<T> (IEnumerable<T> items)
    {
        foreach (var item in items)
        {
            // this test fails
            Assert.IsFalse (Foo (item));
        }
    }
}

경를 이동 전화()에 전달하는 부하의 MyBase 체,각 통화를 Foo 부를 것이 일반적인 Foo()를 true 를 반환합니다.

new MyUtils ().Go (new MyBase[] { new MyBase (), new MyBase () });      

왜지 전문 MyBase 버전을 대신?면 나는 전화 Foo(새로운 MyBase()),직접 제대로 유추하는 전화를 확인합니다.이 때문에 부족의 공분산에 대한 컬렉션에서는 C#3,또는 나는 그냥 바보 같고 이렇게 하지가 제대로 하고 있습니까?

감사합니다!

Isaac

도움이 되었습니까?

해결책

지 않는"전문의"하나이기 때문에 컴파일러 choses 는 방법을 때 호출 프로그램(는 이 경우에는 Go 능)가 컴파일, 을 때 실행됩니다.

을 때 컴파일러를 컴파일 Go 기능,정보만 그것은 거기에 몇 가지 유형의 객체 T.그것은 필요가 없이 어떤 생각할 수 있는 나중에는 시간에 그것을 공급하는 개체의 유형 MyBase.옵션만 그것을 선택하는 것입 Foo<T> 과부하고,그래서 그것은 굽는 것에 컴파일된 프로그램입니다.

하려면 응용 프로그램을 선택한 오버로드 실행 시간,그리고 최고의 선택 과부하여 개체 응용 프로그램이 실행되는 동안,"이라는 동적 dispatch"만 사용하여 동적 언어와 같은 Ruby,Python,PHP,etc.

C#3 은 완전히 정체되는 및 지원하지 않는다.당신이 쓰는 경우 문서 당신의 코드 형식을 확인하는 경우에 당신은 당신이 그것을 가지고 작업하는 이 방법입니다.C#4 에 다른 한편으로,동적 지원합니다.당신이 이것을 쓰는 코드에서는 C#4,당신이 선언할 수 있는'가'기능은 다음과 같습니다:

 public void Go<T> (IEnumerable<dynamic> items)

그때 사용하는 것에 동적 파견서 실행시 선택하는 과부라고 부를 것이 과부의 전문 가 MyBase

다른 팁

C# 사양 (7.4.3.2)에 따르면, 비 게 릭 방법은 일반적인 방법보다 낫으므로 선택해야합니다.

그러나 일반적인 호출 컨텍스트 ( "foreach"루프) 내에서 호출되기 때문에 일반적인 경우 일반적인 것이 픽업된다고 생각합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top