동적 유형을 사용하여 C# 4.0의 오버로드 해상도
-
13-09-2019 - |
문제
아직 C# 4.0 미리보기에 액세스 할 수 없습니다. 그러나 다음과 같은 경우 과부하 된 메소드를 호출 할 때 C# 4.0 런타임은 무엇을하는지 궁금합니다. 일반 오버로드 또는 특수 오버로드로 해결됩니까?
public class Foo<T>
{
protected string BarImpl( T value ) { return "Bar(T) says: " + value.ToString(); }
protected string BarImpl( int value ) { return "Bar(int) says: " + value.ToString(); }
public string Bar( T value )
{
dynamic foo = this;
return foo.BarImpl( value );
}
}
public static void Main( string args[] )
{
var f = new Foo<int>();
Console.WriteLine( f.Bar( 0 ) );
}
해결책
일반적으로, 결과가 가능할 때마다 동일한 코드를 컴파일 한 경우 결과와 동일해야한다는 나의 이해 단지 동적 표현식은 동적 값이 실행 시간에 가지고있는 유형의 표현식으로 대체되었습니다. (정적으로 알려진 유형은 통화 사이트 정보에 보존됩니다.)
이 특별한 경우 .NET 4.0B1이있는 코드 만있는 결과는 다음과 같습니다.
Bar(int) says: 0
그러나, 이것을 다시 보았고 (실제로 어떤 비트가 실제로 역동적인지 확인) 약간 혼란스러워합니다. 나는 그것이 내가 봐야 할 상황 중 하나라고 생각한다 매우 올바른 동작이 무엇인지 이해하기 위해 사양에주의 깊게. 불행히도 C# 4.0 사양이 언제 사용할 수 있는지 모르겠습니다.
추론하기가 까다로운 일이며, 핵심 부분은 실행 시간에 바인더가 값이 유형이라는 것을 해결할 수 있는지 여부입니다. T
똑같이 T
유형이 아닌 수신기로서 int
. 때문에 수화기 이 경우 동적이므로 컴파일러는 과부하 분해능을 전혀 수행하지 않습니다. 흠. 까다로운 것, 확실히.
제휴하지 않습니다 StackOverflow