Учитывая этот упрощенный пример:
abstract class Animal { }
class Dog : Animal
{
public void Bark() { }
}
class Cat : Animal
{
public void Mew() { }
}
class SoundRecorder<T> where T : Animal
{
private readonly T _animal;
public SoundRecorder(T animal) { _animal = animal; }
public void RecordSound(string fact)
{
if (this._animal is Dog)
{
((Dog)this._animal).Bark(); // Compiler: Cannot convert type 'T' to 'Dog'.
((Dog)(Animal)this._animal).Bark(); // Compiles OK
}
}
}
Почему компилятор жалуется на листинг типа (Dog)this._animal
? Я просто не могу понять, почему компилятор, похоже, нуждается в помощи, выполнив две роли. _animal
не может быть чем-то иным, чем Animal
, может ли это?
Конечно, этот вопрос мотивирован примером реальной жизни, когда мне пришлось модифицировать существующий код таким образом, что подобный перевод был самым удобным способом сделать это, не рефакторинг всей партии. (Да, используя состав, а не наследование;)).