C# C链??不同类型的运算符

C# C链??不同类型的运算符,c#,nullable,C#,Nullable,我正在为一个对象实现一个ToString方法。方法如下所示: public override string ToString() { return "E" + (myNum ?? SQLIndex) + STK.ExtraLabel(areaType); } 其中myNum是一个可为null的int,SQLIndex只是一个int 但是权威们已经决定,如果SQLIndex还没有设置,那么如果没有设置,我们应该将其设置为-1,而不是-1 所以我把SQLIndex改成了一个可为null的i

我正在为一个对象实现一个ToString方法。方法如下所示:

public override string ToString()
{
    return "E" + (myNum ?? SQLIndex) + STK.ExtraLabel(areaType);
}
其中myNum是一个可为null的int,SQLIndex只是一个int

但是权威们已经决定,如果SQLIndex还没有设置,那么如果没有设置,我们应该将其设置为-1,而不是-1

所以我把SQLIndex改成了一个可为null的int,但是这段代码不起作用,因为我猜的是??运算符不能同时返回int和string,即使int将被转换为字符串:

public override string ToString()
{
    return "E" + (myNum ?? SQLIndex ?? "NEW") + STK.ExtraLabel(areaType);
}
return "E" + (myNum?.ToString() ?? SQLIndex?.ToString() ?? "NEW") + STK.ExtraLabel(areaType);

我目前正在使用三元运算符来实现相同的效果,但是为了可读性起见,有没有办法使用快捷方式??运算符在这里?

您需要将这里的所有表达式转换为单个类型。在本例中,string实际上是您想要结束的类型,因此您必须在使用???之前将整数转换为string而不是强制转换为string??。您可以使用ToString将整数转换为字符串:

public override string ToString()
{
    return "E" + (myNum ?? SQLIndex ?? "NEW") + STK.ExtraLabel(areaType);
}
return "E" + (myNum?.ToString() ?? SQLIndex?.ToString() ?? "NEW") + STK.ExtraLabel(areaType);

您需要将这里的所有表达式转换为一种类型。在本例中,string实际上是您想要结束的类型,因此您必须在使用???之前将整数转换为string而不是强制转换为string??。您可以使用ToString将整数转换为字符串:

public override string ToString()
{
    return "E" + (myNum ?? SQLIndex ?? "NEW") + STK.ExtraLabel(areaType);
}
return "E" + (myNum?.ToString() ?? SQLIndex?.ToString() ?? "NEW") + STK.ExtraLabel(areaType);

可以将其中一个操作数强制转换为对象:


如果不需要额外的括号。

可以将其中一个操作数强制转换为对象:


如果您不需要额外的括号。

为了可读性,您想使用三元运算符吗?为什么不使用if-else语句来提高可读性?@Aron表示可读性,他想使用两次。表示可读性,你想使用三元运算符?为什么不使用if-else语句来提高可读性?@Aron为了提高可读性,他想使用两次。@Servy我收回了我以前的语句,但是值得指出的是,您需要通过C6编译器运行代码来获得?。运算符进行编译。@Servy我收回了我以前的语句,但是值得指出的是,您需要通过C6编译器运行代码才能获得?。要编译的运算符。因为没有任何操作数指向这些运算符中的任何一个??接线员呼叫有副作用——两者中的哪一个先执行,哪一个第二执行无关紧要。话虽如此,运算符将从左到右求值,而不是从右到左求值,因此即使有副作用,括号也是多余的。@请注意,第一个示例中的paren是必需的,否则它将无法编译-这表明它是从右到左求值的,因为编译器抱怨int??字符串段。第二个例子是int??对象计算结果为int的字符串??object@Servy在任何情况下,我拿出了关于结合性的部分——事实上第一个需要parens,第二个不需要将任何操作数转换为这些操作数??接线员呼叫有副作用——两者中的哪一个先执行,哪一个第二执行无关紧要。话虽如此,运算符将从左到右求值,而不是从右到左求值,因此即使有副作用,括号也是多余的。@请注意,第一个示例中的paren是必需的,否则它将无法编译-这表明它是从右到左求值的,因为编译器抱怨int??字符串段。第二个例子是int??对象计算结果为int的字符串??object@Servy无论如何,我拿出了关于结合性的部分——事实上,第一个需要parens,第二个不需要parens