2012-10-15 58 views
3

我有一個函數可以返回空值struct。 我注意到兩個類似案件爲什麼要將空值轉換爲可空結構

第一:效果很好:

public static GeometricCircle? CircleBySize(GeometricPoint point, double size) 
{ 
    if (size >= epsilon) 
     return null; 

    return new GeometricCircle(point.Position, new Vector(1, 0, 0), size, true); 
} 

二:需要轉換的空值GeometricCircle?

public static GeometricCircle? CircleBySize(GeometricPoint point, double size) 
{ 
    return size > epsilon ? new GeometricCircle(point.Position, new Vector(1, 0, 0), size, true) : (GeometricCircle?)null; 
} 

有誰知道有什麼區別嗎?

+0

如果GeometricCircle是一個類,那麼在我看來,不需要投射。 – ragatskynet

+0

你是對的。該類不是類,而是一個結構。但問題仍然存在,有什麼不同? –

+2

可能重複? http://stackoverflow.com/questions/858080/nullable-types-and-the-aryary-operator-why-is-10-null-forbidden – Silvermind

回答

5

在您的第一個示例中,您在返回nullsize >= epsilon。編譯器知道null是可爲空類型的有效值。

在第二個示例中,您使用的是?: ternary operator,它帶有自己的一組規則。

condition ? first_expression : second_expression; 

MSDN告訴我們(我的重點)...

任的first_expressionsecond_expression類型必須相同,或隱式轉換必須存在從一種類型到另一個。

這裏的關鍵區別是,null不能隱含轉換成GeometricCircle,(你first_expression的類型)。

所以,你必須這樣做明確地,使用強制轉換爲GeometricCircle?,然後將其隱含轉換爲GeometricCircle

+0

一旦編譯成IL,三元運算符是什麼樣的? – Guillaume

+0

null可以隱式轉換爲可以爲null的,但不能轉爲GeometricCircle –