表达式始终为真 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;
编辑:谢谢你的回答,所以应该怎么写才能在每一行中清楚地知道条件是什么,或者为了它的缘故就让它保持原样可读性?
我采用了 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;