[英]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;
如果objectVariable
或StringProperty
为null
向x
分配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.