У меня возникла ситуация, когда мне хотелось бы объяснить поведение компилятора. Дан небольшой код:
interface IFoo<T>
{
T Get();
}
class FooGetter : IFoo<int>
{
public int Get()
{
return 42;
}
}
Следующий код компилируется и запускается:
static class FooGetterGetter
{
public static IFoo<T> Get<T>()
{
return (IFoo<T>)new FooGetter();
}
}
Если мы изменим подпись класса Foo
и добавим ключевое слово sealed
:
sealed class FooGetter : IFoo<int> // etc
Затем я получаю сообщение об ошибке компилятора в следующей строке:
return (IFoo<T>)new FooGetter();
Of:
Невозможно преобразовать тип MyNamespace.FooGetter в MyNamespace.IFoo
.
Кто-нибудь может объяснить, что здесь происходит в отношении запечатанное
ключевое слово? Это C # 4 против проекта .NET 4 в Visual Studio 2010.
Обновление: , что интересно, я наткнулся на эту часть поведения, когда мне было интересно, почему следующий код исправляет это, когда применяется запечатанный
:
return (IFoo<T>)(IFoo<int>)new FooGetter();
Обновление: только для пояснения , все работает нормально, когда запрошенный тип T
совпадает с типом T
, используемым конкретным типом. Если типы различаются, преобразование завершается ошибкой во время выполнения с чем-то вроде:
Невозможно преобразовать объект типа MyNamespace.StringFoo в тип 'MyNamespace.IFoo`1 [System.Int32]'
В приведенном выше примере StringFoo: IFoo
и вызывающий запрос запрашивает int
.