我遇到了这个问题,但是尽管在这里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
是什么导致编译器引发异常?
答案 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
)可能会导致异常行为。