ConcurrentBag FirstOrDefault NullCheck抛出

时间:2016-03-30 15:30:51

标签: c# .net nullreferenceexception

我在空检查中遇到了问题。

if (element == null) 

抛出

  

对象引用未设置为对象的实例。

为什么在此点进行简单的空检查失败?当我在这个位置创建断点时,元素的值为“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:运营商和FileDetail详细信息

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
}

EDIT3: 我在相同的超载中使用了断点,但它从未触发......所以问题可能是FirstOrDefault?

最后: 操作员过载错误。固定它。很多。

2 个答案:

答案 0 :(得分:1)

问题可能是前一行:

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

file参数可能是null

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

答案 1 :(得分:1)

问题在于您的运营商:

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进行比较时,它会尝试访问来自{VersionProduktProduktVersionFileName的属性{1}}实例,因此null

所以,回答你的初始问题NullReferenceException,因为一旦你覆盖了运算符,就没有关于那个空检查的简单问题。 = d

要解决此问题,您可以在"Why can a simple null check fail at this Point?"上添加空检查:

file2