2016-11-16 116 views
-1

我怎樣才能表達以下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 
} 
+0

用最新的.net框架更新您的構建代理 – Jehof

+0

聽起來像構建代理沒有獲得最新版本的C#/ .NET安裝 – ChrisF

+0

我沒有這樣的權利可悲,任何其他建議 – methuselah

回答

8

?.語法是C#6中的一項新功能,它是在引用變量之前檢查變量是否爲空的捷徑。在構建服務器上發生錯誤的事實表明構建服務器仍在運行較舊版本的編譯器。

如果可以,請升級構建代理機器以使用您正在使用的C#和.NET的相同版本進行開發。

如果你不能得到升級,使用最新版本的C#(和.NET)生成代理,那麼你就必須回去檢查空的老辦法:

ItemSupplierName = u != null ? u.SupplierName : null 
+0

我已經添加了一個鏈接到文檔如果多數民衆贊成在你@ChrisF其他只是回滾 – Mafii

4

您的代碼是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) 
       } 

有「空,條件運算符」一看here,搜索。

5

這就是所謂的「null conditional operator」,它在C#6及更高版本中可用。如果?之前的部分是null,它確保給定的術語評估爲null

例如:

String x = objectVariable?.StringProperty; 

在分配的情況下,以nullxobjectVariableStringPropertynull。如果兩者都不爲空,則x將包含值StringProperty

關於它的好處是,你可以IT連鎖:

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); 
0

正如上面@ChrisF提到 - 你需要生成代理升級到最新版本。

運算符?.是C#6的新語法,並允許用戶檢查對象是否爲空。如果運算符的結果爲null,則它自身返回null,而不是解析內部變量/屬性。

所以基本上以前的語法:

ItemSupplierName = (u != null) ? u.SupplierName : ""; 

移動在C#6 simplier版本:

ItemSupplierName = u?.SupplierName ?? ""; 

截至other question回答,你可以去得到升級MS Build tools 2015支持C#6語法&提供編譯器爲此。或者,您也可以將語法更改爲以前版本的C#以使其編譯。

+1

這是錯誤的。在你的第一個例子中,ItemSupplierName在你的第二個例子中是'null'。 –

+0

謝謝!固定。 :-) – Tatranskymedved