`?.` 是做什么的?

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 代码,看起来您正在尝试使用旧版本进行编译。

您必须将 u? 替换为三元运算符:

ExpandedItems = from t in items
                from u in t.Supplier.DefaultIfEmpty()
                select new {
                    ItemName = t.Name
                    ItemSupplierName = (u == null ? null : u.SupplierName)
                }

看看here,搜索"Null-conditional operators"。

?. 语法是 C#6 中的一项新功能,是在引用变量之前检查变量是否为 null 的快捷方式。您在构建服务器上遇到该错误的事实表明构建服务器仍然是 运行 旧版本的编译器。

如果可以,升级生成代理计算机以使用与您用于开发的相同版本的 C# 和 .NET。

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

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

这就是所谓的“null conditional operator”,它在 C# 6 及更高版本中可用。如果 ? 之前的部分是 null.

,它确保给定项的计算结果为 null

例如:

String x = objectVariable?.StringProperty;
如果 objectVariableStringPropertynull

null 分配给 x。如果两者都不为空,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);

正如 @ChrisF 上面提到的 - 您需要将构建代理升级到最新版本。

Operator ?. 是 C# 6 的新语法,允许用户检查对象是否为空。如果运算符的结果为 null,则它 returns 本身为 null 而不是解析内部 variable/attribute.

所以基本上以前的语法:

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

已移至 C# 6 中的更简单版本:

ItemSupplierName = u?.SupplierName ?? "";

, You can go get upgrade MS Build tools 2015 所回答,支持 C# 6 语法并为此提供编译器。或者您也可以将语法更改为以前版本的 C# 以使其编译。