Ключевое слово Sealed влияет на мнение компилятора о приведении

У меня возникла ситуация, когда мне хотелось бы объяснить поведение компилятора. Дан небольшой код:

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 .

19
задан Jeppe Stig Nielsen 19 October 2013 в 07:15
поделиться