Невозможно преобразовать тип: почему необходимо приводить дважды?

Учитывая этот очень упрощенный пример:

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 , не так ли?

Конечно, этот вопрос мотивирован примером из реальной жизни, где мне пришлось изменить существующий код таким образом, чтобы подобное приведение было наиболее удобным способом сделать это без всякого рефакторинга. (Да, используя композицию, а не наследование;)).

23
задан Gert Arnold 2 November 2011 в 09:45
поделиться