使用以下代码:
Guid? x = null;
List<Guid?> y = new List<Guid?>();
y.Add(x);
我希望以下代码返回true y.Contains(x);
,但它返回false。
所以这是一个两部分的问题。
Guid?
或Guid?
的值?答案 0 :(得分:3)
让我们检查您的代码。没有语法糖,它真正说的是:
Nullable<Guid> x = new Nullable<Guid>(new Guid());
List<Nullable<Guid>> y = new List<Nullable<Guid>>();
y.Add(x);
Nullable<>
实际上是struct
,因此它并非真正null
;只有Value
属性才有null
,但由于其基础类型(Guid
)也一个struct
,列表中没有 真的 null
。
那我为什么要解释一下呢?好吧,当List<>.Contains()
实现其魔力时,两个struct
Equals()
方法组合的条件决定了你的空Guid
不等于。
带有两个可以为空的guid的可空等于运算符适用于这种情况,将被调用,并且将始终返回false。
由于在您的解决方案中使用Nullable
是没用的,我会重构您的代码以摆脱它。 Guid
代替了我们可以使用的方便的Empty
属性:
Guid x = Guid.Empty;
List<Guid> y = new List<Guid>();
y.Add(x);
Console.WriteLine(y.Contains(x)); // True
Console.WriteLine(y.Contains(Guid.Empty)); // True
请参阅上面的操作: Ideone
再次,请查看Eric Lippert的this post以获取更多信息。
如果您要查找列表中的所有null
(或空)项,那么检查x
列表中的项x.HasValue
是否更有意义是false
:
var myList = new List<Guid>();
... /* add to myList */
var theEmpties = myList.Where(x => x == Guid.Empty);
答案 1 :(得分:1)
好像你忘了()new List<Guid?>
附近。所以你的代码工作正常,y.Contains(x)
返回true。
我在List<Guid?>
中检查Guid的代码:
Guid guid = Guid.NewGuid();
foreach (var elem in y)
{
if (elem != null && guid == elem.Value)
{
//CODE
}
}