C#链?不同类型的运算符
我正在实现对象的ToString方法。该方法看起来像:C#链?不同类型的运算符
public override string ToString()
{
return "E" + (myNum ?? SQLIndex) + STK.ExtraLabel(areaType);
}
其中myNum是一个可为空的int和SQLIndex只是一个int。
但是权力已经决定,如果SQLIndex尚未设置(如果未设置,则为= -1),则应在其中放置“NEW”而不是-1。
因此,我将SQLIndex更改为可为空的int,但此代码不起作用,因为我在猜测?操作员不能同时返回int和字符串,即使INT将被浇铸为字符串:
public override string ToString()
{
return "E" + (myNum ?? SQLIndex ?? "NEW") + STK.ExtraLabel(areaType);
}
我目前使用三元操作符来完成相同的效果,但为便于阅读的缘故,没有任何如何使用快捷方式?运营商在这里
你可以施放一个操作数到object
:
return "E" + return "E" + (((object)myNum ?? SQLIndex) ?? "NEW") + STK.ExtraLabel(areaType);
或
return "E" + return "E" + (myNum ?? (object)SQLIndex ?? "NEW") + STK.ExtraLabel(areaType);
如果你不想额外的括号。
由于没有任何操作数对这些''''操作符调用有副作用,所以*无关*两者中的哪一个首先执行,哪一个执行第二个。话虽如此,运营商将从左到右进行评估,而不是从右到左,因此即使存在副作用,您的括号也是多余的。 – Servy
@Servy在第一个例子中,parens是_required_,或者它不会编译 - 这表明它是从右到左进行求值的,因为编译器会抱怨int吗? ??字符串'段。第二个例子是'int? ?? (对象??字符串)'计算为'int? ??对象' –
@Servy在任何情况下,我拿出关于结合性的部分 - 事实是第一个需要parens,第二个不 –
为了便于阅读,您想使用三元运算符?为什么不使用'if'' else'语句来提高可读性? – Aron
@Aron为了可读性,他希望两次使用['??'(null-coalescing)运算符](https://msdn.microsoft.com/en-us/library/ms173224.aspx)。 –