詳解c 強制轉換和型別轉換

2022-09-26 01:48:13 字數 2155 閱讀 7180

由於 c# 是在編譯時靜態型別化的,因此變數在宣告後就無法再次宣告,或無法分配另一種型別的值,除非該型別可以隱式轉換為變數的型別。 例如,string 無法隱式轉換為 int。 因此,在將 i 宣告為 int 後,無法將字串「hello」分配給它,如以下**所示:

int i;

// error cs0029: cannot implicitly convert type 'string' to 'int'

i = "hello";

但有時可能需要將值複製到其他型別的變數或方法引數中。 例如,可能需要將乙個整數變數傳遞給引數型別化為 double 的方法。 或者可能需要將類變數分配給介面型別的變數。 這些型別的操作稱為型別轉換。 在 c# 中,可以執行以下幾種型別的轉換:

隱式轉換

對於內建數值型別,如果要儲存的值無需截斷或四捨五入即可適應變數,則可以進行隱式轉換。 對於整型型別,這意味著源型別的範圍是目標型別範圍的正確子集。 例如,long 型別的變數(64 位整數)能夠儲存 int(32 位整數)可儲存的任何值。 在下面的示例中,編譯器先將右側的 num 值隱式轉換為 long 型別,再將它賦給 bignum。

// implicit conversion. a long can

// hold any value an int can hold, and more!

int num = 2147483647;

long bignum = num;

有關所有隱式數值轉換的完整列表,請參閱內建數值轉換一文的隱式數值轉換表部分。

對於引用型別,隱式轉換始終存在於從乙個類轉換為該類的任何乙個直接或間接的基類或介面的情況。 由於派生類始程式設計客棧終包含基類的所有成員,因此不必使用任何特殊語法。

derived d = new derived();

// always ok.

base b = d;

顯式轉換

但是,如果進行轉換可能會導致資訊丟失,則編譯器會要求執行顯式轉換,顯式轉換也稱為強制轉換。 強制轉換是顯式告知編譯器以下資訊的一種方式:你打算進行轉換且你知道可能會發生資料丟失,或者你知道強制轉換有可能在執行時失敗。 若要執行強制轉換,請在要轉換的值或變數前面的括號中指定要強制轉換到的型別。 下面的程式將 double 強制轉換為 int。如不強制轉換則該程式不會進行編譯。

class test

}// output: 1234

有關支援的顯式數值轉換的完整列表,請參閱內建數值轉換一文的顯式數值轉換部分。

對於引用型別,如果需要從基型別轉換為派生型別,則必須進行顯式強制轉換:

// create a new derived type.

giraffe g = new giraffe();

// implicit conversion to base type is safe.

animal a = g;

// explicit conversion is required to cast back

// to derived type. note: this will compile but will

// throw an exception at run time if the right-side

// object is not in fact a giraffe.

giraffe g2 = (giraffe)a;

引用型別之間的強制轉換操作不會更改基礎物件的執行時型別;它只更改用作對該物件引用的值的型別。 有關詳細資訊,請參閱多型性。

執行時的型別轉換異常

在某些引用型別轉換中,編譯器無法確定強制轉換是否會有效。 正確進行編譯的強制轉換操作有可能在執行時失敗。 如下面的示例所示,型別轉換在執行時失敗將導致引發 invalidcastexception。

class animal

class reptile : animal

class mammal : animal

class unsafecast

static void test(animal a)

}test 方法有乙個 animal 形式引數,因此,將實際引數 a 顯式強制轉換為 reptile 會造成危險的假設。 更安全的做法是不要做出假設,而是檢查型別。 c# 提供 is 運算子,使你可以在實際執行強制轉換之前測試相容性。 有關詳細資訊,請參閱如何使用模式匹配以及 as 和 is 運算子安全地進行強制轉換。

C 強制型別轉換

四種型別可能很多人都常常忽略就象我一樣,但是有時還是比較有用的。不了解的建議看看,一些機制我也不是十分了解,只是將一些用法寫出來讓大家看看。強制轉化無論從語法還是語意上看,都是c 中最難看的特徵之一。但是基於c風格的轉化的語義的不明確性及其一些潛在問題。強制型別轉化最終還是被c 接受了。1.stat...

C 強制型別轉換

標準c 中主要有四種強制轉換型別運算子 const cast,reinterpret cast,static cast,dynamic cast等等。1 static cast a 將位址a轉換成型別t,t和a必須是指標 引用 算術型別或列舉型別。表示式static cast a a的值轉換為模板中...

C 強制型別轉換

關於強制型別轉換的問題,很多書都討論過,寫的最詳細的是c 之父的 c 的設計和演化 最好的解決方法就是不要使用c風格的強制型別轉換,而是使用標準c 的型別轉換符 static cast,dynamic cast。標準c 中有四個型別轉換符 static cast,dynamic cast,reint...