kalenderdose
kalenderdose

Reputation: 69

ConcurrentBag FirstOrDefault NullCheck throws

I've got a Problem at my null check .

if (element == null) 

throws

Object reference not set to an instance of an object.

Why can a simple null check fail at this Point? When i make a breakpoint at this Position, element has the value "null", but throws the exception anyway.

PS: At this Point, are no additional Threads active.

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;
        }

EDIT: file is not null, the list is empty but not null

EDIT2: Operator and FileDetail details

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: I used a breakpoint in my equal overload, but it never triggered... So the problem is maybe the FirstOrDefault?

finally: Operatoroverload was faulty. Fixed it. Ty a lot.

Upvotes: 0

Views: 799

Answers (2)

Anderson Pimentel
Anderson Pimentel

Reputation: 5767

The problem lies in your operators:

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;
}

When you compare an instance to null it's trying to access the properties Version, Produkt, ProduktVersion and FileName from a null instance, hence the NullReferenceException.

So, answering to your initial question "Why can a simple null check fail at this Point?", it's because there's nothing simple about that null check once you override the operators. =D

To solve it, you can add a null check on 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;
}

Upvotes: 1

Anderson Pimentel
Anderson Pimentel

Reputation: 5767

The problem may be the previous line:

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

The file parameter is probably null.

EDIT: If file is not null, then the FileDetails.Equals method can be the culprit.

Upvotes: 1

Related Questions