都是不同的。
typeof
采用类型名称(您在编译时指定)。GetType
获取实例的运行时类型。is
如果实例在继承树中,则返回true。
例
class Animal { } class Dog : Animal { }void PrintTypes(Animal a) { Console.WriteLine(a.GetType() == typeof(Animal)); // false Console.WriteLine(a is Animal); // true Console.WriteLine(a.GetType() == typeof(Dog)); // true Console.WriteLine(a is Dog);// true }Dog spot = new Dog(); PrintTypes(spot);那
typeof(T)呢 在编译时也解决了吗?
是。T始终是表达式的类型。请记住,泛型方法基本上是一堆具有适当类型的方法。例:
string Foo<T>(T parameter) { return typeof(T).Name; }Animal probably_a_dog = new Dog();Dog definitely_a_dog = new Dog();Foo(probably_a_dog); // this calls Foo<Animal> and returns "Animal"Foo<Animal>(probably_a_dog); // this is exactly the same as aboveFoo<Dog>(probably_a_dog); // !!! This will not compile. The parameter expects a Dog, you cannot pass in an Animal.Foo(definitely_a_dog); // this calls Foo<Dog> and returns "Dog"Foo<Dog>(definitely_a_dog); // this is exactly the same as above.Foo<Animal>(definitely_a_dog); // this calls Foo<Animal> and returns "Animal". Foo((Animal)definitely_a_dog); // this does the same as above, returns "Animal"


