将System.Object转换为布尔值

3
mydata类型为System.Object时, 什么情况下会出现(bool) mydata是有效的转换?
显然,如果实际类型或基础类型为布尔值,则该转换是有效的。
但是,如果基础类型是整数或字符串,该转换是否也是有效的?例如:
int value=1;
object mydata=value;
if ((bool) value) { ... }

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


1
参见:http://blogs.msdn.com/b/ericlippert/archive/2009/03/19/representation-and-identity.aspx - Billy ONeal
6个回答

3

int不是bool。尝试一下,看看会发生什么(抛出InvalidCastException异常)。

需要注意的是,大多数基元类型都明确实现了IConvertible,所以可以通过以下方式获取所需的转换:

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

在进行如 intbool 这样的转换时,转换是通常采用 C 语言风格完成的:0为false,非零则为true。值得注意的是,这种行为与形式逻辑相背离,在形式逻辑中,伪命题有多个值,是所有不为真的值,而真命题只有一个值。但我偏离了主题。
至于自定义转换,无论是隐式还是显式,您所做的就是提供被编译器识别为运算符的自定义方法。当然,转换的具体实现取决于您和您的实现。在这里,类Foo知道如何将自己[显式地]转换为类Bar的实例。
class Foo
{
  public static explicit operator Bar(Foo x)
  {
    // your implementation here
    throw new NotImplementedException();
  }
}

在这里,Bar类知道如何将自己显式地转换为一个int并隐式地转换为一个Foo

class Bar
{
    public static explicit operator int(Bar x)
    {
        // your implementation here
        throw new NotImplementedException();
    }
    public static implicit operator Foo(Bar x)
    {
        // your implementation here
        throw new NotImplementedException();
    }
}

当你开始混合不同类型的数据时,编译器将会确定哪些转换方法是适用(或不适用)的,并进行解决。你可能会得到一个关于类型转换的编译错误,或者编译器将选择在运行时调用一个转换方法。

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


注意:转换运算符仅在破坏标识的情况下被调用。在保留标识的情况下,它们不会被使用。有关更多详细信息,请参见http://blogs.msdn.com/b/ericlippert/archive/2009/03/19/representation-and-identity.aspx。 - Billy ONeal

2

这段内容的翻译源自Eric Lippert的博客:

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

C#中的类型转换运算符可用于保持标识的转换(例如,将基类引用解释为派生类引用)和破坏标识的转换(例如,将int转换为double)。每个类型转换运算符只能调用其中的一个

当你将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

1
首先要明确的是,将一个对象转换为布尔值仅在该对象是引用类型的布尔值包装器或Nullable<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

在C#中将一个object转换为另一种类型时,运行时具有关于被强制类型转换的对象的运行时类型的足够信息来验证操作,并在转换无效时抛出InvalidCastException异常。
当运行时对象的动态类型与您要转换的类型不匹配时,应使用Convert类的方法。

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;
}

如果你准备好处理类型实际上不是T类型的情况,那么as才是合适的。使用bool myBool = test1.GetValueOrDefault()可以避免使用if语句,使代码更加简洁。 - Billy ONeal

0

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

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

0
use this  code for convert object to Boolean

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

变量t等于propInfo.GetValue(item, null); 将t转换为布尔类型,赋值给state。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接