Dot-Net
泛型類型何時確定?可以影響嗎?
我一直在玩泛型,我看到了一些奇怪的東西。希望大家給個解釋!為了讓一切變得更容易,我將“問題”放在了一個例子中:
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