`?.` 是做什么的?
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;
如果 objectVariable
或 StringProperty
是 null
, 将 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# 以使其编译。
如何在不使用
的情况下表达以下 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;
如果 objectVariable
或 StringProperty
是 null
, 将 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 ?? "";
如