什么?的做

本文关键字:的做 什么 | 更新日期: 2023-09-27 18:18:07

如何在不使用

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

什么?的做

这就是所谓的"null条件运算符",在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);

?.语法是c# 6中的一个新特性,是在延迟变量之前检查变量是否为空的捷径。你在构建服务器上得到这个错误的事实表明构建服务器仍在运行旧版本的编译器。

如果可以的话,将构建代理机器升级为使用您正在使用的c#和。net的相同版本。

如果你不能让构建代理升级到使用最新版本的c#(和。net),那么你将不得不回到检查null的旧方法:

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

你的代码是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)
                }

看这里,搜索" null条件运算符"

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

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

基本上是前面的语法:

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

在c# 6中变成了更简单的版本:

ItemSupplierName = u?.SupplierName ?? "";

正如在其他问题上的回答,你可以去升级MS Build tools 2015,它支持c# 6语法&为此提供编译器。或者您也可以将语法更改为以前版本的c#来编译它。