比较null返回值时出现NullReferenceException

时间:2018-07-06 01:47:51

标签: c# nullreferenceexception

我遇到了这个问题,但是尽管在这里https://dotnetfiddle.net/xDVa2a进行了尝试,但仍无法弄清是什么原因,也无法复制它。我的课程结构如下:

public abstract class ProductNode
{
    public ProductCategory ParentCategory { get; set; }
}

public class ProductCategory : ProductNode { }

public class TreeNode<T> where T : class
{
    private readonly T _value;

    public T Value() {
        return _value;
    }

    public TreeNode(T value) {
        _value = value;
    }
}

在我的代码中,我创建了一个类型为ProductNode的TreeNode,其构造函数参数为null,并使用LINQ过滤了一个IQueryable,以将ProductNode与TreeNode中的值进行比较。

IQueryable<ProductNode> allProductNodes = _context.ProductNodes;
TreeNode<ProductNode> treeNode = new TreeNode<ProductNode>(null);
List<ProductNode> productNodes = allProductNodes
    .Where(node => node.ParentCategory == treeNode.Value()).ToList(); // NullReferenceException

这将引发NullReferenceException,但是,如果我调整查询以与null进行比较,则可以正常工作。

List<ProductNode> productNodes = allProductNodes
    .Where(node => node.ParentCategory == null).ToList(); // Works

List<ProductNode> productNodes = allProductNodes
    .Where(node => node.ParentCategory == (treeNode.Value() ?? null)).ToList(); // Alternative, working solution

是什么导致编译器引发异常?

3 个答案:

答案 0 :(得分:0)

您正在使用the "??" operator,如果不为null,则返回treeNode.Value(),如果为null,则返回右侧。

因此,在两种情况下,您都返回null,基本上null.ToList()是您的最终结果,也是您的Null Ref的来源。

答案 1 :(得分:0)

如果要返回??,则返回null,则使用null没有意义。相反,您可能想做的是:

treeNode.Value()?.ToList();

这样可以做到,如果treeNode.Value()不为空,它将在其上调用.ToList()。但是,如果它是null,则不会调用.ToList(),并且应该消除该错误。

答案 2 :(得分:0)

您尝试过吗:

List<ProductNode> productNodes = allProductNodes.ToList()
.Where(node => node.ParentCategory == (treeNode.Value() ?? null));

恐怕在treeNode.Value()上调用函数(在这种情况下为IQueryable)可能会导致异常行为。