2015-08-14 47 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,第二個不 –