繁体   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