コードを調べてみましょう。構文糖衣なしで実際に言うことは次のとおりです。
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
アイテムを確認する方が理にかなっています。x
x.HasValue
false
var myList = new List<Guid>();
... /* add to myList */
var theEmpties = myList.Where(x => x == Guid.Empty);