Dot-Net

泛型類型何時確定?可以影響嗎?

  • March 1, 2011

我一直在玩泛型,我看到了一些奇怪的東西。希望大家給個解釋!為了讓一切變得更容易,我將“問題”放在了一個例子中:

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();
       }
   }
}

所以,我的實驗室裡有兩隻動物:一隻狗和一隻鳥。當我“踢”那些動物時,它們會發出聲音。列印機將列印聲音和動物的類型。當我執行程序時,它會列印:

踢鳥:Lab.Animal 說“鳴叫!”

踢狗:Lab.Animal 說‘吠,吠!我會咬你!

列印踢狗:Lab.Dog 說“吠,吠!我會咬你!

為什麼狗的第一腳就告訴我它是那種類型的Lab.Animal而且…我怎樣才能讓它返回Lab.Dog

狗的第一腳告訴你類型參數的編譯時類型是 Lab.Animal。換句話說,你的Animal.Kick方法是有效的:

Printer.Print<Animal>(this, Sound);

類型參數不是多態確定的——它們是在編譯時確定的。當一個呼叫的類型參數實際上是呼叫上下文的類型參數時,它變得更加複雜,但它本質上是同一類東西。

要讓它說Lab.Dog,你必須得到對象的實際執行時間類型,例如使用

obj.GetType().FullName

引用自:https://stackoverflow.com/questions/5153554