2017-09-01 28 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; 
}