使用条件运算符?避免条件

时间:2017-09-01 01:19:17

标签: c#

我有以下C#代码

cut

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隐含地转换为int?int

我的意图是,如果Explict conversion exists are you missing a cast?包含一个元素,则应将其分配给SConfig[] cGpsdIp。如果它包含两个元素,则第二个元素应被视为GpsdPortCompassIp。如果可以,我真的想避免和CompassPort

3 个答案:

答案 0 :(得分:3)

代码中的内容是null conditional operator。您的正确语法应为:

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

PS:如果可以编译,你会在运行时得到 Index超出范围的异常。

答案 1 :(得分:2)

除了if语句之外,你所做的任何事情都会比简单的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;
}

答案 2 :(得分:1)

你应该学习C#的基础知识。尝试访问数组边界外的项时,会引发IndexOutOfRangeException而不是返回默认的可空值。

您的解决方案是使用if运算符:

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