这个问题让我好奇...当你想要定义一个类型时,你必须说GetType(Type)例如:GetType(字符串),但字符串本身不是字符串吗?
为什么在这些情况下需要使用GetType?并且,如果原因是因为它期望类型'类型'...为什么不是转换隐含...我的意思是,所有数据都在那里......
答案 0 :(得分:9)
您正在做的是获取对该类型的元数据的引用...如果您查看API的C#版本typeof(string)
,则可能会更加明显。 。返回一个Type
对象,其中包含有关字符串类型的信息。
通常在使用反射或其他元编程技术时会这样做
答案 1 :(得分:3)
string
是类型,int
是类型,Type
是类型,它们不相同。但是关于为什么没有隐式转换,MSDN不建议这样做:
通过消除不必要的演员阵容, 隐式转换可以改进 源代码可读性。然而, 因为隐式转换可能会发生 没有程序员的指定 他们必须小心谨慎 令人不快的惊喜。一般来说, 隐式转换运算符应该 从不抛出异常,永不丢失 信息,以便他们可以使用 没有程序员的安全 意识。如果是转换运算符 它应该不符合那些标准 明确标记。
注意:
永远不会丢失信息以便他们 可以安全使用,没有 程序员的意识
答案 2 :(得分:2)
如果要定义类型,必须说GetType(Type)ex。:GetType(string)...
那不是真的。每次执行以下任何操作
class MyClass
{
///...
}
class MyChildClass : MyClass
{
}
struct MyStruct
{
///...
}
您正在定义一种新类型。
如果原因是因为它期望类型'类型'...为什么不是转换隐含...我的意思是,所有数据都在那里......
这样做的一个原因是多态性。例如,如果允许我们执行以下操作:
MyChildClass x;
....GetType(x)
GetType(x)
可以返回MyChildClass
,MyClass
或Object
,因为x
实际上是所有这些类型的实例。
值得注意的是Type
本身就是一个类(即它继承自Object
),所以你可以继承它。虽然我不确定你为什么要这样做而不是覆盖默认的反射行为(例如,隐藏内部的窥探)。
答案 3 :(得分:1)
GetType(string)将返回相同的信息。看它就像你会不变的那样。获取表示字符串的Type对象的唯一方法是实例化字符串对象并调用o.GetType()。此外,这对于接口和抽象类型是不可能的。
如果您想知道变量的运行时类型,请调用它的.GetType()方法,因为运行时类型可能与声明的变量类型不同。