ConcurrentBag FirstOrDefault NullCheck 抛出

ConcurrentBag FirstOrDefault NullCheck throws

我的 null 检查有问题。

if (element == null) 

投掷

Object reference not set to an instance of an object.

为什么此时简单的空检查会失败?当我在此位置创建断点时,元素的值为 "null",但无论如何都会抛出异常。

PS:此时,没有其他线程处于活动状态。

internal static ConcurrentBag<Node_Library> AddFileDetail(
                   this ConcurrentBag<Node_Library> list, 
                       FileDetails file , Node<Node_Application> app)
        {
            var element = list.FirstOrDefault(x => file.Equals(x));
            if (element == null)
            {
                list.Add(new Node_Library(file, app));
            }
            else
            {
                if (!element.ApplicationNodes.Contains(app))
                {
                    element.AddNode(app);
                }
            }
            return list;
        }

编辑:文件不为空,列表为空但不为空

EDIT2:操作员和文件详细信息

public class FileDetails
{
 internal string FileName {  get; private set; }
    internal string Name {  get; private set;}
    internal string Endung { get; private set; }
    internal string Version { get; private set; }
    internal string Produkt { get; private set; }
    internal string ProduktVersion { get; private set; }
    internal FileTyp Filetyp { get; private set; }
    internal string Pfad { get; private set; }

    public static bool operator==(FileDetails file1, Node_Library library)
    {
        return
            file1.Version == library.Version &&
            file1.Produkt == library.Produkt &&
            file1.ProduktVersion == library.ProduktVersion &&
            file1.FileName == library.FileName;
    }
    public static bool operator !=(FileDetails file1, Node_Library library)
    {
        return
            !(file1.Version == library.Version &&
            file1.Produkt == library.Produkt &&
            file1.ProduktVersion == library.ProduktVersion &&
            file1.FileName == library.FileName);
    }


    public static bool operator ==(FileDetails file1, FileDetails  file2)
    {
        if (
            file1.FileName == file2.FileName &&
            file1.Produkt == file2.Produkt &&
            file1.ProduktVersion == file2.ProduktVersion &&
            file1.Version == file2.Version)
            return true;
        return false;
    }
    public static bool operator !=(FileDetails file1, FileDetails file2)
    {
        if (
             file1.Name == file2.Name &&
             file1.Produkt == file2.Produkt &&
             file1.ProduktVersion == file2.ProduktVersion &&
             file1.Version == file2.Version)
            return false;
        return true;
    }

    internal bool Equals(Node_Library file2)
    {

        if (file2 == null)
        {
            return false;
        }
        return (
          Name == file2.Name &&
          Produkt == file2.Produkt &&
          ProduktVersion == file2.ProduktVersion &&
          Version == file2.Version);
    }

//More Stuff
}

编辑3: 我在相等重载中使用了一个断点,但它从未触发过……所以问题可能出在 FirstOrDefault 上?

最后: Operatoroverload 错误。固定它。很多。

问题可能出在前一行:

var element = list.FirstOrDefault(x => file.Equals(x));

file参数大概是null.

编辑:如果 file 不为空,那么 FileDetails.Equals 方法可能是罪魁祸首。

问题出在你的运营商:

public static bool operator==(FileDetails file1, Node_Library library)
{
    return
        file1.Version == library.Version &&
        file1.Produkt == library.Produkt &&
        file1.ProduktVersion == library.ProduktVersion &&
        file1.FileName == library.FileName;
}

当您将实例与 null 进行比较时,它会尝试从 [=12] 访问属性 VersionProduktProduktVersionFileName =] 实例,因此 NullReferenceException.

所以,回答您最初的问题 "Why can a simple null check fail at this Point?",这是因为一旦您覆盖运算符,空值检查就没有什么简单的了。 =D

为了解决它,你可以在file2上添加一个空检查:

public static bool operator ==(FileDetails file1, FileDetails  file2)
{
    if (file2 != null &&
        file1.FileName == file2.FileName &&
        file1.Produkt == file2.Produkt &&
        file1.ProduktVersion == file2.ProduktVersion &&
        file1.Version == file2.Version)
        return true;
    return false;
}