无法将类型'object'隐式转换为'bool'

时间:2015-01-04 16:50:14

标签: c#

为什么在将其值赋给变量时必须转换对象,但如果我使用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'
    }
}

2 个答案:

答案 0 :(得分:4)

您需要了解变量的编译时类型与其值的执行时间类型之间的区别。编译器使用编译时类型来查找成员(例如方法)并计算出可用的转换。这也包括重载解析。

执行时类型用于覆盖,而GetType()(当然在执行时执行)返回值的执行时类型。例如:

 object x = "hello";
 Console.WriteLine(x.GetType()); // System.String
 Console.WriteLine(x.Length); // Compile-time error

这里编译时类型xobject(又名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