2014-10-28 38 views
2

mydata類型爲System.Object時,在哪種情況下(bool) mydata有效投射?Casting System.Object到布爾值

也就是說,如果實際或不關聯的類型是一個布爾值,顯然它將是一個有效的轉換。

但是,如果基礎類型是int或者string,那麼它也是有效的演員嗎?例如,

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 – 2014-10-28 19:25:51

回答

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,非零爲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(); 
    } 
} 

當您啓動混合東西了,編譯器會找出轉換方法(S)都適用(或不)並加以解決。您將得到關於轉換的編譯錯誤,或者編譯將選擇一個轉換方法在運行時調用。

在運行時,當然可能會在轉換過程中拋出異常。

+0

注意:轉換運算符只能在破壞身份的情況下調用。在身份保留情況下,他們不被使用。有關更多詳細信息,請參閱http://blogs.msdn.com/b/ericlippert/archive/2009/03/19/representation-and-identity.aspx。 – 2014-10-28 19:29:56

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

'as'只適用於您準備處理這個類型實際上不是T類型的。你的''if's比'bool myBool = test1.GetValueOrDefault()'更清潔,它避免了if。 – 2014-10-28 19:28:50

1

第一件事,第一:一個object的強制轉換爲bool是有效的,只有當object對於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類的方法。

2

從埃裏克利珀的博客轉述:

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 
0

使用此代碼爲轉換對象到布爾

var t = propInfo.GetValue(item, null); 
bool state = Convert.ToBoolean(t); 
0
use this code for convert object to Boolean 

變種T = propInfo.GetValue(項目,NULL); bool state = Convert.ToBoolean(t);