2015-08-14 44 views
1

我正在实现对象的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); 
} 

我目前使用三元操作符来完成相同的效果,但为便于阅读的缘故,没有任何如何使用快捷方式?运营商在这里

+1

为了便于阅读,您想使用三元运算符?为什么不使用'if'' else'语句来提高可读性? – Aron

+1

@Aron为了可读性,他希望两次使用['??'(null-coalescing)运算符](https://msdn.microsoft.com/en-us/library/ms173224.aspx)。 –

回答

5

您将需要将这里的所有表达式转换为单一类型。在这种情况下,string确实是您想要的类型,因此您必须在使用??之前将转换为(不是强制转换)整数。您可以使用ToString整数转换为字符串:

return "E" + (myNum?.ToString() ?? SQLIndex?.ToString() ?? "NEW") + STK.ExtraLabel(areaType); 
+1

@Servy我收回了我之前的声明,但是值得指出的是,您需要通过C#6编译器运行代码以获取编译的'。.'运算符。 – Aron

+0

该死的工作场所没有升级到VS 2015呢... – zhang

3

你可以施放一个操作数到object

return "E" + return "E" + (((object)myNum ?? SQLIndex) ?? "NEW") + STK.ExtraLabel(areaType); 

return "E" + return "E" + (myNum ?? (object)SQLIndex ?? "NEW") + STK.ExtraLabel(areaType); 

如果你不想额外的括号。

+0

由于没有任何操作数对这些''''操作符调用有副作用,所以*无关*两者中的哪一个首先执行,哪一个执行第二个。话虽如此,运营商将从左到右进行评估,而不是从右到左,因此即使存在副作用,您的括号也是多余的。 – Servy

+0

@Servy在第一个例子中,parens是_required_,或者它不会编译 - 这表明它是从右到左进行求值的,因为编译器会抱怨int吗? ??字符串'段。第二个例子是'int? ?? (对象??字符串)'计算为'int? ??对象' –

+0

@Servy在任何情况下,我拿出关于结合性的部分 - 事实是第一个需要parens,第二个不 –