我有以下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[] c
和GpsdIp
。如果它包含两个元素,则第二个元素应被视为GpsdPort
和CompassIp
。如果可以,我真的想避免和CompassPort
。
答案 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;
}