나는 컴파일러의 동작을 설명하고자하는 상황이 있습니다. 우리가 Foo
클래스의 서명을 변경 한 경우봉인 된 키워드는 캐스트에 대한 컴파일러의 의견에 영향을줍니다.
static class FooGetterGetter
{
public static IFoo<T> Get<T>()
{
return (IFoo<T>)new FooGetter();
}
}
과 sealed
키워드 추가 :
interface IFoo<T>
{
T Get();
}
class FooGetter : IFoo<int>
{
public int Get()
{
return 42;
}
}
다음 컴파일 및 실행 : 약간의 코드를 감안할 때
sealed class FooGetter : IFoo<int> // etc
을 그렇다면 다음 줄에 컴파일러 오류가 발생합니다.
의3210:
'MyNamespace.IFoo <T>'에 유형 'MyNamespace.FooGetter을'변환 할 수 없습니다
사람이 sealed
키워드와 관련하여 여기에 무슨 일이 일어나고 있는지 설명 할 수 있습니까? 이것은 비주얼 스튜디오에서 .NET 4 프로젝트에 대해 C# 4입니다 2010 년
업데이트 :가 흥미롭게 내가 sealed
를 적용 할 때 다음과 같은 코드를 수정 이유를 궁금해 할 때 동작의 일부에 발견 :
return (IFoo<T>)(IFoo<int>)new FooGetter();
업데이트 : 요청 T
의 유형이 콘크리트 종류에 따라 사용 T
의 유형과 동일 할 때 단지 설명을위한, 모든 것이 잘 실행됩니다. 종류가 다른 경우, 캐스트는 같은과 런타임에 실패
를 입력 유형 'MyNamespace.StringFoo'의 개체를 캐스팅 할 수 없습니다'MyNamespace.IFoo`1 [선택 System.Int32]'
위의 예에서 StringFoo : IFoo<string>
이고 발신자가 int
을 요청합니다.
내가 대답이 없어,하지만 난 그것을'IFoo이''FooGetter' 구현 반면 열린 제네릭 형식이 사실 함께 할 수있는 뭔가가 상상 'IFoo '는 닫힌 제네릭 유형입니다. –
참고 사항 : 나는 질문을 게시하기 전에 정의 된 동작을 받았는지 확인했습니다. 자신을 바보로 만들고 싶지 않았습니다. 왜 그것이 허용되는지, 컴파일러가 무슨 일이 일어나는 지 보증 할 수없는 것을 볼 수 있습니다. 그것이 성공의 기회를 가진다는 것을 알고 있습니다. 그러나 어떤 이유로 인해 봉인 된 키워드가 존재할 때 성공할 가능성은 사라집니다. 파생 될 수 없기 때문에 T와 일치 할 수 없다고 가정합니다. –
+1 흥미 롭습니다 :) – leppie