将System.Object转换为布尔值

时间:2014-10-28 19:02:13

标签: c# .net

(bool) mydata类型为mydata时,System.Object在哪种情况下有效演员?

即,如果实际或不正确的类型是布尔值,它显然是有效的强制转换。

但如果基础类型为intstring,它是否也是有效的强制转换?如,

int value=1;
object mydata=value;
if ((bool) value) { ... }

实际上我想知道C#中的显式转换是如何工作的。是否有某种反射用于检查即使处理object类型时是否存在任何有效转换?

6 个答案:

答案 0 :(得分:2)

int不是bool。试一试,看看会发生什么(InvalidCastException)。

InvalidlCastException thrown

应该注意的是,大多数原始类型都明确地实现了IConvertible,因此您可以通过这种方式获得所需的演员:

int    a = 37 ;
object b = a ;
bool   c = (b as IConvertible) != null && (b as IConvertible).ToBoolean(null);

如果是intbool这样的转换,则转换以通常的C类方式完成:零为false,非零为{{1 }}。值得注意的是,这种行为与形式逻辑不一致,其中虚假是多重的,所有这些都不是真实的,而且是真正的单值。但我离题了。

就自定义转换而言,无论是隐式转换还是显式转换,您所做的只是提供由编译器识别为运算符的自定义方法。当然,转换的 取决于您和您的实施。这里,类true知道如何将自己[显式]转换为类Foo的实例:

Bar

此处,课程class Foo { public static explicit operator Bar(Foo x) { // your implementation here throw new NotImplementedException(); } } 知道如何[明确]将自己转换为Bar并[隐式]将自身转换为int

Foo

当你开始混合时,编译器会找出适用(或不适用)的转换方法并解决它们。您将获得有关转换的编译错误,或者编译将选择在运行时调用的转换方法。

当然,在运行时,可能会在转换过程中抛出异常。

答案 1 :(得分:2)

从Eric Lippert的博客转载:

http://blogs.msdn.com/b/ericlippert/archive/2009/03/19/representation-and-identity.aspx

C#强制转换运算符用于标识保留转换(例如,将此对基类的引用解释为对派生类的引用)和标识销毁转换(例如,将此int转换为double)。只允许一次使用强制转换操作符来调用中的一个

由于您装了int,因此int可以取消装箱的唯一内容是int(这是一个身份保留案例)。一旦将其取消装箱到int,它就可以转换(在身份破坏案例中)转换为bool

那是:

int iii = 123;
object ooo = iii;            // Box the int
bool bbb = (bool) iii;       // Perfectly legal
bool jjj = (bool) (int) ooo; // Perfectly legal
bool kkk = (bool) ooo;       // Invalid cast exception

答案 2 :(得分:1)

第一件事:仅当objectboolobject的引用类型包装时,boolNullable<bool>的强制转换才有效类型:

bool val1 = true;
object mydata1=val1;
if ((bool) val1) { ... } // This is valid
bool? val2 = false;
object mydata2=val2;
if ((bool) val2) { ... } // This is valid too

当您将object转换为C#中的另一个类型时,运行时具有足够的信息,用于验证操作的类型转换对象的运行时类型,并在转换无效时抛出InvalidCastException

在运行时对象的动态类型与您希望它投射的类型不匹配的情况下,您应该使用Convert类的方法。

答案 3 :(得分:0)

使用as运算符和nullable布尔值bool?可能是减少异常和简化投放的最佳方法。

object test1 = 1;
object test2 = true;

var testBool1 = test1 as bool?;
var testBool2 = test2 as bool?;

if (testBool1.HasValue) 
{
  // test1 is a boolean
  bool mybool = testBool1.Value;
}

if (testBool2.HasValue)
{
  // test2 is a boolean
  bool mybool = testBool2.Value;
}

答案 4 :(得分:0)

使用此代码将对象转换为布尔值

 var t = propInfo.GetValue(item, null);
bool state = Convert.ToBoolean(t);

答案 5 :(得分:0)

use this  code for convert object to Boolean

var t = propInfo.GetValue(item,null); bool state = Convert.ToBoolean(t);