表达式始终为真 Resharper 提示

Expression is always true Resharper Hint

编辑:谢谢你的回答,所以应该怎么写才能在每一行中清楚地知道条件是什么,或者为了它的缘故就让它保持原样可读性?

我采用了 answer from How do I concatenate two arrays in C#? 到 return 空数组而不是抛出错误

public static T[] Concat<T>(this T[] x, T[] y)
{
    
    if (x == null && y != null) return  y;
    if (x != null && y == null) return  x;
    if (x == null && y == null) return new T[0];

    int oldLen = x.Length;
    Array.Resize<T>(ref x, x.Length + y.Length);
    Array.Copy(y, 0, x, oldLen, y.Length);
    return x;
}

Resharper 正在制作波浪线,“表达式始终为真”提示:

我不明白的是,对于 2 个不同的变量应该有 4 种不同的情况,每个 2 个,4 的排列:(x 为空,x 不为空)(y 为空,y 不是空)

所以总共有 4 个案例我试图在 if 中捕获

更改行的顺序只是将波浪线移动到最后一个 if 行。

if (x == null && y != null) return  y;
if (x != null && y == null) return  x;
if (x == null && y == null) return new T[0];

1 如果 x 为 null 而 y 不为 null 你 return y

2 如果 x 不为 null 且 y 为 null 你 return x

3 如果 x 为空,则根据您的第一个条件,y 必须为空。

布尔代数命题逻辑恶作剧

当你写这篇文章时

if (x == null && y != null) return  y;

那么当你再次比较x == null的时候,那么y == null就天生就为真

不可能是别的

更新

if (x == null) return y ?? new T[0];
if (y == null) return x;
...

int oldLen = x.Length;
Array.Resize<T>(ref x, x.Length + y.Length);
Array.Copy(y, 0, x, oldLen, y.Length);
return x;

就这么简单

如果我们查看您的第一张和最后一张支票:

if (x == null && y != null) return  y;
if (x == null && y == null) return new T[0];

请注意,我们已经测试了两个 x == null && y != null,所以如果我们通过了检查,那么我们 肯定 如果 x == null y 必须 为空(如果不是,那么我们已经返回 y.

这是一种无需冗余检查即可检查相同条件的方法:

if (x == null && y == null) return new T[0];   // If they're both null, return a new thing
if (x == null) return y;                       // Otherwise if only one of them is null,
if (y == null) return x;                       // then return the other one

或者,如果您喜欢的话,您也可以在一行中完成所有操作:

if (x == null || y == null) return x == null ? y == null ? new T[0] : y : x;