为什么在将其值赋给变量时必须转换对象,但如果我使用GetType()
函数则返回其值。
对不起,我的英语不好,但我希望你理解我在说什么。
class Program
{
static void Main(string[] args)
{
object o = true;
Console.WriteLine(o.GetType()); //System.Boolean
bool s = o; //Cannot implicitly convert type 'object' to 'bool'
}
}
答案 0 :(得分:4)
您需要了解变量的编译时类型与其值的执行时间类型之间的区别。编译器使用编译时类型来查找成员(例如方法)并计算出可用的转换。这也包括重载解析。
执行时类型用于覆盖,而GetType()
(当然在执行时执行)返回值的执行时类型。例如:
object x = "hello";
Console.WriteLine(x.GetType()); // System.String
Console.WriteLine(x.Length); // Compile-time error
这里编译时类型x
是object
(又名System.Object
),它没有Length
属性 - 所以你得到编译时失败,即使在执行时,x
的值也是对字符串的引用。
您可以使用dynamic
类型强制在执行时发生绑定,使用变量的执行时类型:
dynamic x = "hello";
Console.WriteLine(x.Length); // Uses String.Length and prints 5
x = new object[10];
Console.WriteLine(x.Length); // Uses Array.Length and prints 10
然而,根据我的经验,这通常是最后的手段,对于真正动态的情况(例如访问 没有编译时类型的JSON数据)。
答案 1 :(得分:2)
bool s = (bool)o;
你应该这样写,你需要施展它。
显式转换(强制转换):显式转换需要强制转换 运营商。当信息可能丢失时,需要进行强制转换 转换,或转换可能对其他转换不成功 原因。典型的例子包括数字转换为一种类型 具有较低的精度或较小的范围,以及基类的转换 实例到派生类。
您可以查看此MSDN article以获取更多信息。您也可以阅读boxing and unboxing