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