嵌套空值检查C#的简写

据我所知,没有一个更优雅的方式来写下面的….

string src; if((ParentContent!= null) &&(ParentContent.Image("thumbnail") != null) &&(ParentContent.Image("thumbnail").Property("src") != null)) src = ParentContent.Image("thumbnail").Property("src").Value 

你认为应该有一个C#语言function来缩短它吗?
如果是这样,它应该是什么样的?
例如,像扩展?? 操作者

 string src = ParentContent??.Image("thumbnail")??.Property("src")??.Value; 

为相当人为的例子和我过度简化的解决方案道歉。

编辑……许多年后
现在这是一个名为“ Null传播运算符 ”的计划语言function?. https://roslyn.codeplex.com/discussions/540883 (谢谢@Brian)

这样做没有内置语法,但您可以定义扩展方法来执行此操作:

 R NotNull(this T src, Func f) where T : class where R : class { return src != null ? f(src) : null; } 

现在,您可以按如下方式重写示例:

 src = ParentContent.NotNull(p => p.Image("thumbnail")). NotNull(i => i.Property("src")).NotNull(src => src.Value); 

它不像语法支持那么好,但我会说它更具可读性。

请注意,这会将NotNull方法添加到所有.NET类型,这可能有点不方便。 您可以通过定义一个简单的包装类型WrapNull where T : class来解决这个问题, WrapNull where T : class只包含类型T的值,以及一种将任何引用类型转换为WrapNull并在WrapNull类型中提供NotNullWrapNull 。 然后代码看起来像这样:

 src = WrapNull.Wrap(ParentContent).NotNull(p => p.Image("thumbnail")). NotNull(i => i.Property("src")).NotNull(src => src.Value); 

(因此,您不会使用新的扩展方法污染每种类型的IntelliSense)

通过更多的努力,您还可以定义LINQ查询运算符来执行此操作。 这有点矫枉过正,但有可能写出来(我不会在这里包含定义,因为它们有点长,但有可能有人感兴趣:-))。

 src = from p in WrapNull.Wrap(ParentContent) from i in p.Image("thumbnail"). from src in i.Property("src") select src.Value; 

它被建议并且显然被团队拒绝:

对于null,更多C#语法糖

建议的语法看起来像a.?b.?c() – 非常有用,而且毫不含糊。

我真的很想看到它,但看起来不会发生。 也许如果有足够的人投票呢!

我们考虑过C#4,但没有预算。 这是很多人要求的一个很好的function,所以也许我们会把它变成一个未来的假设语言版本。 没有承诺。

纠正我,如果我错了,但这可以使用C#6.0的空条件运算符来解决:

 string src = ParentContent?.Image("thumbnail")?.Property("src")?.Value; 

如果在此值赋值之前已经使用了src则可以按如下方式使用它:

 string src = ....; // ... src = ParentContent?.Image("thumbnail")?.Property("src")?.Value ?? src; // ... 

它仍然有点不尽如人意,但我会这样写:

 var src = ParentContent == null ? null : ParentContent.Image("thumbnail") == null ? null : ParentContent.Image("thumbnail").Property("src") == null ? null : ParentContent.Image("thumbnail").Property("src").Value;