C# IList Equals:如果可空类型不能为空,为什么会出现可空编译器警告?
C# IList Equals: Why is there a nullable compiler warning if the nullable typ could not be null?
我想为两个 IList 编写自己的 Equals 方法。我从空检查和列表条目计数开始。我以为我检查了所有的可能性,然而在空检查之后我得到了编译器警告“取消引用可能为空的引用”。用于长度检查。
x
和 y
在 null 检查后不能为 null 还是我错过了什么?使用 x is not null && y is not null && x.Count != y.Count)
没有警告,但是编译器不应该通过之前的检查隐含地知道这一点吗?我知道我可以使用 !-Operator(null 宽容运算符),但这是否解决了问题的根源?
代码如下:
public bool Equals(IList<int>? x, IList<int>? y)
{
if (x is null & y is null)
{
return true;
}
else if (x is null & y is not null)
{
return false;
}
else if (x is not null & y is null)
{
return false;
}
else if (x.Count != y.Count) //warning: y and x could be null
{
return false;
}
else
{
.....
}
}
在此先感谢您对我的启发。
尽管您使用 &
运算符而不是 &&
,但编译器似乎在您的情况下生成了误报。
您可以按如下方式简化您的逻辑:
public static bool Equals(IList<int>? x, IList<int>? y)
{
if (x is null)
{
return y is null;
}
if (y is null)
{
return false;
}
if (x.Count != y.Count) // No warning
{
return false;
}
...
}
我想为两个 IList 编写自己的 Equals 方法。我从空检查和列表条目计数开始。我以为我检查了所有的可能性,然而在空检查之后我得到了编译器警告“取消引用可能为空的引用”。用于长度检查。
x
和 y
在 null 检查后不能为 null 还是我错过了什么?使用 x is not null && y is not null && x.Count != y.Count)
没有警告,但是编译器不应该通过之前的检查隐含地知道这一点吗?我知道我可以使用 !-Operator(null 宽容运算符),但这是否解决了问题的根源?
代码如下:
public bool Equals(IList<int>? x, IList<int>? y)
{
if (x is null & y is null)
{
return true;
}
else if (x is null & y is not null)
{
return false;
}
else if (x is not null & y is null)
{
return false;
}
else if (x.Count != y.Count) //warning: y and x could be null
{
return false;
}
else
{
.....
}
}
在此先感谢您对我的启发。
尽管您使用 &
运算符而不是 &&
,但编译器似乎在您的情况下生成了误报。
您可以按如下方式简化您的逻辑:
public static bool Equals(IList<int>? x, IList<int>? y)
{
if (x is null)
{
return y is null;
}
if (y is null)
{
return false;
}
if (x.Count != y.Count) // No warning
{
return false;
}
...
}