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] 访问属性 Version
、Produkt
、ProduktVersion
和 FileName
=] 实例,因此 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;
}
我的 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] 访问属性 Version
、Produkt
、ProduktVersion
和 FileName
=] 实例,因此 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;
}