문제

아직 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. 때문에 수화기 이 경우 동적이므로 컴파일러는 과부하 분해능을 전혀 수행하지 않습니다. 흠. 까다로운 것, 확실히.

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