什么叫做??.?

met*_*lah -1 c# linq c#-6.0

如何在不使用的情况下表达以下linq查询

ItemSupplierName = u?.SupplierName

我在上面一行的构建代理程序中尝试编译时,一直收到CS1525,CS1003错误消息.

- CS1525 Invalid expression term '.'
- CS1003 Syntax error, ':' expected
Run Code Online (Sandbox Code Playgroud)

下面的代码,它在本地完美运行但在构建代理上失败.

ExpandedItems = from t in items
                               from u in t.Supplier.DefaultIfEmpty()
select new {
ItemName = t.Name
ItemSupplierName = u?.SupplierName
}
Run Code Online (Sandbox Code Playgroud)

Chr*_*isF 8

?.语法是C#6中的新功能,是检查变量不是deferencing之前空了捷径.您在构建服务器上收到该错误的事实表明构建服务器仍在运行旧版本的编译器.

如果可以,请将构建代理程序计算机升级为使用与您用于开发的相同版本的C#和.NET.

如果您无法升级构建代理以使用最新版本的C#(和.NET),那么您将不得不回到检查null的旧方法:

ItemSupplierName = u != null ? u.SupplierName : null
Run Code Online (Sandbox Code Playgroud)


Tho*_*mar 6

这就是所谓的" 空条件运算符 ",可在C#6及更高版本中使用.它确保给定期限的计算结果为null,如果以前的部分?null.

例如:

String x = objectVariable?.StringProperty;
Run Code Online (Sandbox Code Playgroud)

分配nullx案件objectVariable或者StringPropertynull.如果两者都不为null,x则将包含值StringProperty.

关于它的好处是你可以链接它:

String s = object1?.SomeList?[0]?.SubProperty?.Value;
Run Code Online (Sandbox Code Playgroud)

这取代了以下结构:

String s = null;
if (object1 != null && 
    object1.SomeList!= null && 
    object1.SomeList[0] != null &&
    object1.SomeList[0].SubProperty != null)
  s = object1.SomeProperty.SubProperty.Value;
Run Code Online (Sandbox Code Playgroud)

使用它的另一种方法是举起活动.直到C#6你写了这样的东西:

private event EventHandler<EventArgs> MyEvent;

if (MyEvent != null)
    MyEvent(this, EventArgs.Empty);
Run Code Online (Sandbox Code Playgroud)

现在你可以写

MyEvent?.Invoke(this, EventArgs.Empty);
Run Code Online (Sandbox Code Playgroud)