mydata
类型为System.Object
时, 什么情况下会出现(bool) mydata
是有效的转换?显然,如果实际类型或基础类型为布尔值,则该转换是有效的。
但是,如果基础类型是整数或字符串,该转换是否也是有效的?例如:
int value=1;
object mydata=value;
if ((bool) value) { ... }
实际上,我想知道在C#中显式转换是如何工作的。当处理object
类型时,是否使用某种反射来检查是否存在任何有效的转换?
mydata
类型为System.Object
时, 什么情况下会出现(bool) mydata
是有效的转换?int value=1;
object mydata=value;
if ((bool) value) { ... }
实际上,我想知道在C#中显式转换是如何工作的。当处理object
类型时,是否使用某种反射来检查是否存在任何有效的转换?
int
不是bool
。尝试一下,看看会发生什么(抛出InvalidCastException异常)。
需要注意的是,大多数基元类型都明确实现了IConvertible
,所以可以通过以下方式获取所需的转换:
int a = 37 ;
object b = a ;
bool c = (b as IConvertible) != null && (b as IConvertible).ToBoolean(null);
int
→ bool
这样的转换时,转换是通常采用 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();
}
}
当你开始混合不同类型的数据时,编译器将会确定哪些转换方法是适用(或不适用)的,并进行解决。你可能会得到一个关于类型转换的编译错误,或者编译器将选择在运行时调用一个转换方法。
当然,在运行时,转换过程中可能会抛出异常。
这段内容的翻译源自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
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
转换为另一种类型时,运行时具有关于被强制类型转换的对象的运行时类型的足够信息来验证操作,并在转换无效时抛出InvalidCastException
异常。Convert
类的方法。要减少异常并使转换变得容易,您最好的做法可能是使用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;
}
as
才是合适的。使用bool myBool = test1.GetValueOrDefault()
可以避免使用if
语句,使代码更加简洁。 - Billy ONeal使用此代码将对象转换为布尔值
var t = propInfo.GetValue(item, null);
bool state = Convert.ToBoolean(t);
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。