형추를 통해 폐쇄<T>
-
11-09-2019 - |
문제
몇몇 게시물에 이미 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"루프) 내에서 호출되기 때문에 일반적인 경우 일반적인 것이 픽업된다고 생각합니다.