2017-09-01 71 views
0

我有下面的C#代碼使用條件運算符?避免如果條件

public Config(SConfig[] c) 
{ 
    GpsdIp = c[0].Ip; 
    GpsdPort = c[0].Port; 

    CompassIp = c[1]?.Ip; 
    CompassPort = c[1]?.Port; 
} 

CompassPort = c[1]?.Port;被給予警告(red carpet) 不能implictly轉換int?intExplict conversion exists are you missing a cast?

我在這裏的意圖是,如果SConfig[] c包含一個元素,它應該分配給GpsdIpGpsdPort。如果它包含兩個元素,則第二個元素應該被視爲CompassIpCompassPort。如果可以的話,我真的很想避免和if condition

+1

爲什麼你想避免'if'?如果沒有第二個元素,你期望'CompassIp/Port'能保持什麼值? –

+1

下面的答案適合您的目的。只是爲了澄清錯誤的原因。當你使用'c [1] ?. ip''時,你正在爲右手邊變量賦一個整數,但如果它不存在,那麼它將賦值NULL,因爲你的變量沒有準備好。既然你有'int CompassIp'因此這個錯誤。如果你想使用你的原始代碼,你應該有'int? CompassIp「,即CompassIp應該是可爲空的整數,而不僅僅是整數。是的,甚至在你可以用NULL值做任何事情之前,索引異常都會出現在那裏。 –

回答

2

你的代碼是什麼null conditional operator。你的正確語法應該是:

CompassIp = c.Length > 1 ? c[1].Ip : null; 
CompassPort = c.Length > 1 ? c[1].Port : 0; 

PS:你會得到一個索引超出範圍異常在運行時,如果它是編譯。

1

你應該學習C#的基礎知識。當嘗試訪問數組範圍外的項目時,會引發IndexOutOfRangeException而不是返回默認的可空值。

爲您的解決方案是使用if操作:

if (c.Length > 1) 
{ 
    CompassIp = c[1].Ip; 
    CompassPort = c[1].Port; 
} 
2

任何你做,除了if語句,來完成同樣的會比簡單的,如果更多的開銷。

也就是說,三元組似乎已經成熟。

public Config(SConfig[] c) { 
    GpsdIp = c[0].Ip; 
    GpsdPort = c[0].Port; 

    CompassIp = c.Length == 1 ? CompassIp : c[1].Ip; 
    CompassPort = c.Length == 1 ? CompassPort : c[1].Port; 
}