3 回答

TA貢獻(xiàn)1805條經(jīng)驗(yàn) 獲得超9個(gè)贊
類型不等價(jià),你得到 null,這就是as工作原理
但是,您可以直接Cast
long? i = 10000;
var s = (int?)i;
// or even better make sure its *checked*
var s = checked((int?)i);
為什么這行得通?
C# 語(yǔ)言規(guī)范 11.6.1 可空轉(zhuǎn)換
...
基于從 S 到 T 的基礎(chǔ)轉(zhuǎn)換評(píng)估可空轉(zhuǎn)換的過程如下:
如果可以為空的轉(zhuǎn)換是 from
S?
到T?
:如果源值為 null(
HasValue
屬性為false
),則結(jié)果為null
type 的值T?
。否則,轉(zhuǎn)換被評(píng)估為從to的展開,然后是從to的基礎(chǔ)轉(zhuǎn)換,然后是從to的包裝。
S?
S
S
T
T
T?
...
as
不這樣做,它檢查運(yùn)行時(shí)類型,如果它們不相等則返回 nullT?
其他資源
checked 關(guān)鍵字用于顯式啟用整數(shù)類型算術(shù)運(yùn)算和轉(zhuǎn)換的溢出檢查。
#從評(píng)論更新
我知道我們無(wú)法轉(zhuǎn)換,為什么我們不能這樣做,但為什么他們建議在任何情況下它都會(huì)有用,即編譯器錯(cuò)誤 CS0077的一些隨機(jī)圖像鏈接“as 運(yùn)算符必須與引用類型或可為空的類型('int' 是不可為空的值類型)?!?/em>
原因是(在您的圖像示例中)值類型不能為 null 它永遠(yuǎn)無(wú)法使用它。您缺少的是可能發(fā)生的更復(fù)雜的示例,您可以在自定義類型上定義隱式運(yùn)算符等。

TA貢獻(xiàn)1111條經(jīng)驗(yàn) 獲得超0個(gè)贊
編譯器無(wú)法將“l(fā)ong”隱式轉(zhuǎn)換為“int”
根據(jù) MSDN
as 運(yùn)算符類似于強(qiáng)制轉(zhuǎn)換操作。但是,如果無(wú)法進(jìn)行轉(zhuǎn)換,則 as 返回 null 而不是引發(fā)異常。
ref: as (C# 參考)
因此,使用您的代碼,無(wú)法進(jìn)行轉(zhuǎn)換,因?yàn)榉祷?Null。
- 3 回答
- 0 關(guān)注
- 217 瀏覽
添加回答
舉報(bào)