2016-12-30 55 views
4

我正在审查一些代码,我横跨下面的代码行传来:为什么会?出现在IEnumerable <int>?.ToList()?

List authorIntList = authorIds?.ToList(); 

在上面的例子中,是authorIds一个IEnumerable。在上面的代码行中,?的用途是什么?我不确定我以前见过这种模式。它在做什么以及在哪个版本的.NET中实现?

+5

[空,条件运算符(https://msdn.microsoft.com/en-us/library/dn986595.aspx) –

回答

10

这就是所谓的the "null conditional operator" - 即?.一起 - 新的C#6.0。这意味着,如果authorIds而不是null,那么它会调用/返回ToList()就可以了。否则,它将返回null。它基本上是语法糖,因此您不必编写更长的代码,如List AuthorIntList = authorIds != null ? authorIds.ToList() : null;

-1

修正空条件运算 https://msdn.microsoft.com/en-us/library/dn986595.aspx

这就好比说,如果属于AuthorID的不是null,则执行ToList()否则返回null。

+2

这其实不太一样。 –

+2

Elvis是空合并'?:',而不是空条件'?.'。 –

+1

@ rory.ap:空合并运算符'??'不完全相同,因为它比较为null而不是false。 –

0

“空条件运算符”作为一种缩写的方式存在“如果这不为空,则执行该操作,否则返回空值”。这是基本相同

List authorIntList = authorIds ? authorIDs.ToList() : null; //null coalescing 

List authorIntList = null; 
if(authorIDs != null) { authorIntList = authorIDs.ToList(); } //traditional if 
0

这是一个空条件运算符,在许多语言的人把它叫做Elvis操作符。它已从c#6.0中添加并使用null检查代码。

所以,如果你有这样的:

var x= a?.b?.c?.d; 

X将是无效的,如果任何一个,B,C的或D为空。如果它们全都不为空,它将是d中的值。在你必须把它们放在条件之前。

if(a!= null && a.b!= null && a.b.c!= null) 
{ 
    x= a?.b?.c?.d; 
} 
+0

不是猫王。查看Woot的答案下的评论。 –

+0

@ rory.ap我已经写过,它被称为空条件。在mva.microsoft.com的c#6.0介绍中,他们提到了Elvis的名字,但他们不确定他们会使用这个名字。 –