首页 > 解决方案 > 为什么在 byte[] 元素上使用 any() 时会出现 NullException

问题描述

我想测试我的 byte[] 元素 ImageData 是否包含任何数据。如果没有数据,我的数据库将其显示为 NULL。我尝试使用 .Any() 方法,但由于某种原因这不起作用。为什么?

我已经用下面的代码试过了

public FileStreamResult ViewImage(int id)
{
    Candidate candidate = _context.Candidate.FirstOrDefault(m => m.Id == id);
    bool hasImage = candidate.ImageData.Any();  // I get the NullException here          

    if (hasImage)
    {
        MemoryStream ms = new MemoryStream(candidate.ImageData);
        return new FileStreamResult(ms, candidate.ImageType);
    }
    return null;            
}

如果我使用逻辑 if(candidate.ImageData == null),我会得到一个trueor false。我考虑过使用 Any() 更优雅。有什么建议么?

标签: c#asp.net-core-mvc

解决方案


它不起作用,因为您在空引用上调用方法...在这种情况下,它是一个扩展方法,因此您将获得 aArgumentNullException而不是 a NullReferenceException,但它的行为与记录的完全一样

如果需要,您可以为此编写自己的扩展方法:

public class NullSafeEnumerable
{
    public static bool NonNullAny<T>(this IEnumerable<T> source) =>
        source is object && source.Any();
}

(这不是一个好名字,但你可以想出你自己的名字。)

或者您可以使用空条件运算符:

bool hasImage = candidate.ImageData?.Any() ?? false;

或(等效地):

bool hasImage = candidate.ImageData?.Any() == true;

推荐阅读