У меня есть ситуация, в которой я хотел бы объяснить поведение компилятора. С учетом небольшого кода:
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();
Из:
Невозможно преобразовать тип 'MyNamespace.FooGetter' в 'MyNamespace.IFoo '
Может кто-нибудь объяснить, что здесь происходит с ключевым словом sealed
? Это C # 4 против проекта .NET 4 в Visual Studio 2010.
Обновление: Интересно, я наткнулся на эту часть поведения, когда мне было интересно, почему следующий код исправляет это при применении sealed
:
return (IFoo<T>)(IFoo<int>)new FooGetter();
Обновление: только для пояснения, все работает нормально, когда запрашиваемый тип T
совпадает с типом T
, используемым конкретным типом. Если типы различаются, приведение не выполняется во время выполнения с чем-то вроде:
Невозможно привести объект типа 'MyNamespace.StringFoo' к типу.
'MyNamespace.IFoo`1 [System.Int32]'
В приведенном выше примере StringFoo : IFoo<string>
и вызывающий абонент просит получить int
.