2

次のコードで:

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

次のコードはtrueを返すと思いますy.Contains(x);が、falseを返します。

つまり、これは2つの部分からなる質問のようなものです。

  1. リストにxが明確に含まれているのに、なぜfalseが返されるのですか?
  2. GUIDをどのようにループしますか?nullGuid?またはGuid?with値がリストにあるかどうかを確認するためのリスト?
4

2 に答える 2

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()さて、がその魔法を実行するときが来ると、2 つstructの のメソッドの組み合わせの条件により、空の が等しくないとEquals()判断されます。Guid

2 つの null 許容 GUID を取る null 許容等価演算子は、この状況で適用され、呼び出され、常に 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アイテムを確認する方が理にかなっています。xx.HasValuefalse

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 に答える