Когда определяются универсальные типы? Можно ли повлиять на это?

Я играл с дженериками и видел некоторые странные вещи. Надеюсь, у вас есть объяснение! Чтобы все было проще, я привел «проблему» в пример:

namespace Lab
{
    public class Animal
    {
        public Animal(string sound)
        {
            this.Sound = sound;
        }

        public string Sound { get; private set; }

        public void Kick()
        {
            Printer.Print(this, Sound);
        }
    }

    public class Dog : Animal
    {
        public Dog() : base("Bark, bark! I'll bite you!") { }
    }

    public class Printer
    {
        public static void Print<T>(T obj, string message)
        {
            System.Console.WriteLine("{0} says '{1}' \n", typeof(T).FullName.PadRight(10), message);
        }
    }

    public static class Program
    {
        static void Main(string[] args)
        {
            Animal bird = new Animal("Tweet!");
            Dog dog = new Dog();

            System.Console.WriteLine("Kick bird:");
            bird.Kick();
            System.Console.WriteLine("Kick dog:");
            dog.Kick();
            System.Console.WriteLine("Print kick dog:");
            Printer.Print(dog, dog.Sound);

            System.Console.ReadLine();
        }
    }
}

Итак, у меня в лаборатории есть два животных: собака и птица. Когда я "пинаю" этих животных, они издают звук. Принтер напечатает звук и тип животного. Когда я запускаю программу, она печатает:

Kick bird: Lab.Animal говорит: «Твитни!»

Пинайте собаку: Лаборатория животных говорит: «Лай, лай! Я тебя укушу! »

Распечатать собачку: Собака-лаборатория говорит: «Лай, лай! Я тебя укушу! »

Почему первый удар собаки говорит мне, что это тип Lab.Animal ? И ... как я могу заставить его вернуть Lab.Dog ?

8
задан Kees C. Bakker 1 March 2011 в 13:06
поделиться