2

使用以下代码:

Guid? x = null;
List<Guid?> y = new List<Guid?>();
y.Add(x);

我希望以下代码返回 true y.Contains(x);,但它返回 false。

所以这是一个两部分的问题。

  1. 为什么当列表中有 x 时它返回 false?
  2. 我将如何遍历 Guid?列表以检查列表中是否存在空值Guid?Guid?带值?
4

2 回答 2

3

让我们检查您的代码。没有语法糖,它真正说的是:

Nullable<Guid> x = new Nullable<Guid>(new Guid());
List<Nullable<Guid>> y = new List<Nullable<Guid>>();
y.Add(x);

解释

Nullable<>实际上是 a struct,所以它从来都不是null;只有它的Value属性有可能存在null,但由于它的基础类型 ( Guid)也是a struct,所以列表中的任何内容都不是真的 null

那我为什么要解释呢?好吧,List<>.Contains()到了施展魔法的时候,这两种方法的结合条件struct决定Equals()了你的 empty Guids 不相等。

采用两个可空 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 的这篇文章以获取更多信息。

更新:

如果您正在寻找列表中的所有null(或空)项目,也许检查列表中的项目更有意义xwhere x.HasValueis false

var myList = new List<Guid>();
... /* add to myList */
var theEmpties = myList.Where(x => x == Guid.Empty);
于 2012-09-21T20:52:04.067 回答
1

好像你忘了 () 附近new List<Guid?>。所以你的代码工作正常并y.Contains(x)返回true。我的检查 Guid 代码List<Guid?>

Guid guid = Guid.NewGuid();
foreach (var elem in y)
{
    if (elem != null && guid == elem.Value)
    {
        //CODE
    }
}
于 2012-09-21T20:56:40.417 回答