簡體   English   中英

`?.`有什么作用?

[英]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;

如果objectVariableStringPropertynullx分配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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM