У меня есть ситуация, когда мне хотелось бы объяснить поведение компилятора. Учитывая небольшой код:
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
.