2017-06-19 40 views
2

我想在theme.VersionStamp插入另一个空检查。有没有一种方法可以将它插入SequenceEqual参数中?空传播 - 第二空检查

if (theme.VersionStamp != null) 
{ 
    if (!origTheme?.VersionStamp.SequenceEqual(theme.VersionStamp) ?? false) 
    { 
     throw new TwConcurrencyException(); 
    } 
} 
+0

_“我想插入另一个空检查的主题”_ - 为什么?当你到达代码的那一部分时,你已经知道这个值不是'null'。那里有一个空检查的重点是什么?如果有一点,你想要什么样的空检查?你想要什么结果?解决你的问题,使其包含一个很好的[mcve],清楚地表明你正在做什么,解释代码的作用,以及你想要它做什么,以及具体是什么,你无法弄清楚。 –

回答

1

它不是必需的,因为正确反正你制作的空检查if (theme.VersionStamp != null){,然后出发。但是,你仍然可以再次检查和传递的默认参数一样

if (!origTheme?.VersionStamp.SequenceEqual(theme.VersionStamp ?? new VersionStamp()) ?? false) 

另外,我想你的第一个null检查延伸到下面

if (theme != null && theme.VersionStamp != null) 
{ 
+0

“主题”总是有价值的。 theme.versionstamp可以是空的。 – jengfad

+0

如果'theme'也可以为null,则第一个检查可以是'if(theme?.VersionStamp!= null)',它将封装两者。 –

+0

因此,我检查了代码的原始作者,结果发现当某个逻辑被击中时,他错过了填充对象的版本标记,这就是为什么我得到空版本戳的实例。无论如何,感谢您的帮助,我学到了很多东西。 :) – jengfad

1

不幸的是,路过的时候一种说法是添加空校验不可能。

你可以得到最短的是:

if (theme?.VersionStamp == null || 
    !origTheme?.VersionStamp?.SequenceEqual(theme.VersionStamp) ?? false) 
{ 
    throw new TwConcurrencyException(); 
} 

我不会传似拉胡尔的默认参数是干什么的,因为如果origThemeVersionStamp等于默认VersionStampSequenceEqual会错误地返回true

+1

使用C#7和[Throw Expressions](https://github.com/dotnet/roslyn/issues/13389)现在可以这样做:'.SequenceEqual(theme.VersionStamp ?? throw new ArgumentException(...) )但是,在这个**案件中,由于前面的if语句,它是不必要的。 –