Jon*_*eet 26

您只能typeof()在编译时知道该类型时使用,并且您正在尝试获取相应的Type对象.(尽管类型可以是泛型类型参数,例如typeof(T)在具有类型参数的类中T.)不需要使用该类型的任何实例typeof.操作数typeof始终是类型或类型参数的名称.它不能是变量或类似的东西.

现在比较一下object.GetType().这将获得它被调用的对象的实际类型.这意味着:

  • 你不需要在编译时知道类型(通常你不知道)
  • 需要有是类型的实例(否则你有什么可调用GetType上)
  • 您的代码无需访问实际类型 - 例如,它可能是不同程序集中的内部类型

一个奇怪的观点:GetType由于拳击工作的方式,将对可空值类型给出意想不到的答案.调用GetType将始终涉及装箱任何值类型,包括可空值类型,并且可空值类型的装箱值是空引用或对非可空值类型的实例的引用.


Hen*_*man 9

GetType()在运行时工作,typeof()是编译时运算符.

所以,

// untested, schematic
void ShowType(Object x)
{
   Write(x.GetType().Name);  // depends on actual type
   // typeof(x) won't actually compile
   Write(typeof(x).Name);   // always System.Object
}

ShowType("test");
Run Code Online (Sandbox Code Playgroud)

将打印System.String和System.Object.

请参阅此问题以获得更好的示例.

  • 实际上,`typeof`不能与实例一起使用,因此`typeof(x)`将不会编译. (5认同)