当(bool) mydata
类型为mydata
时,System.Object
在哪种情况下有效演员?
即,如果实际或不正确的类型是布尔值,它显然是有效的强制转换。
但如果基础类型为int
或string
,它是否也是有效的强制转换?如,
int value=1;
object mydata=value;
if ((bool) value) { ... }
实际上我想知道C#中的显式转换是如何工作的。是否有某种反射用于检查即使处理object
类型时是否存在任何有效转换?
答案 0 :(得分:2)
int
不是bool
。试一试,看看会发生什么(InvalidCastException)。
应该注意的是,大多数原始类型都明确地实现了IConvertible
,因此您可以通过这种方式获得所需的演员:
int a = 37 ;
object b = a ;
bool c = (b as IConvertible) != null && (b as IConvertible).ToBoolean(null);
如果是int
→bool
这样的转换,则转换以通常的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)
第一件事:仅当object
是bool
或object
的引用类型包装时,bool
到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
当您将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);