[英]What does `?.` do?
我如何不使用以下方式表達以下linq查詢
ItemSupplierName = u?.SupplierName
嘗試在上一行的構建代理中編譯CS1525,CS1003錯誤消息時,我不斷收到該消息。
- CS1525 Invalid expression term '.'
- CS1003 Syntax error, ':' expected
下面的代碼可在本地完美運行,但無法在構建代理上運行。
ExpandedItems = from t in items
from u in t.Supplier.DefaultIfEmpty()
select new {
ItemName = t.Name
ItemSupplierName = u?.SupplierName
}
?.
語法是C#6中的新功能,是在遞歸之前檢查變量是否為null的捷徑。 您在構建服務器上收到該錯誤的事實表明,構建服務器仍在運行較舊版本的編譯器。
如果可以,請升級構建代理機器,以使用與您用於開發的相同版本的C#和.NET。
如果您無法升級構建代理以使用最新版本的C#(和.NET),則必須返回到檢查null的舊方法:
ItemSupplierName = u != null ? u.SupplierName : null
這就是所謂的“ 空條件運算符 ”,在C#6和更高版本中可用。 如果在?
之前的部分,則確保給定項的值為null
?
為null
。
例如:
String x = objectVariable?.StringProperty;
如果objectVariable
或StringProperty
為null
向x
分配null
。 如果兩者都不為null,則x
將包含StringProperty
的值。
它的好處是您可以將其鏈接:
String s = object1?.SomeList?[0]?.SubProperty?.Value;
這將替換如下結構:
String s = null;
if (object1 != null &&
object1.SomeList!= null &&
object1.SomeList[0] != null &&
object1.SomeList[0].SubProperty != null)
s = object1.SomeProperty.SubProperty.Value;
使用它的另一種方法是引發事件。 在C#6之前,您編寫了以下內容:
private event EventHandler<EventArgs> MyEvent;
if (MyEvent != null)
MyEvent(this, EventArgs.Empty);
現在你可以寫
MyEvent?.Invoke(this, EventArgs.Empty);
您的代碼是C#6代碼,似乎您正在嘗試使用舊版本進行編譯。
你要替換u?
使用三元運算符:
ExpandedItems = from t in items
from u in t.Supplier.DefaultIfEmpty()
select new {
ItemName = t.Name
ItemSupplierName = (u == null ? null : u.SupplierName)
}
在這里看看,搜索“空條件運算符”。
正如@ChrisF前面提到的-您需要將構建代理升級到最新版本。
運算符?.
是C#6的新語法,允許用戶檢查對象是否為null。 如果operator的結果為null,則它本身返回null而不是解析內部變量/屬性。
所以基本上是以前的語法:
ItemSupplierName = (u != null) ? u.SupplierName : "";
已移至C#6的簡化版本:
ItemSupplierName = u?.SupplierName ?? "";
正如在其他問題上回答的那樣,您可以獲取支持C#6語法並為此提供編譯器的升級MS Build工具2015 。 或者,您也可以將語法更改為C#的早期版本以進行編譯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.