什么`?.`做什么?

时间:2016-11-16 13:04:11

标签: c# linq c#-6.0

如何在不使用

的情况下表达以下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
}

4 个答案:

答案 0 :(得分:8)

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

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

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

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

答案 1 :(得分:6)

这就是所谓的“null conditional operator”,可在C#6及更高版本中找到。如果null之前的部分为?,则可确保给定的字词的评估结果为null

例如:

String x = objectVariable?.StringProperty;
如果nullxobjectVariable

会将StringProperty分配给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);

答案 2 :(得分: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,搜索“Null-conditional operators”。

答案 3 :(得分:0)

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

运算符?.是C#6的新语法,允许用户检查对象是否为空。如果operator的结果为null,则它本身返回null而不是解析内部变量/属性。

基本上是以前的语法:

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

已经转向C#6中的简化版本:

ItemSupplierName = u?.SupplierName ?? "";

正如other question所述,您可以升级MS Build tools 2015,它支持C#6语法&amp;为此提供编译器。或者您也可以将语法更改为以前版本的C#以进行编译。