より良いエンジニアを目指して

1日1つ。良くなる!上手くなる!

Dictionary<int,T>.FirstOrDefault()のdefaultってnullではない?

数値をキーとするDictionary型のFirstOrDefaultってnullが返ってこないようです。

大抵、FirstOrDefaultで値がないなど無効である場合は、nullが返って来ることを期待して、判定します。

例えば、以下のコード。

using System;
using System.Collections.Generic;
using System.Linq;
                    
public class Program
{
    class Person {
        public string Name {get; set;}
        public int Age { get; set;}                           
    }
    
    public static void Main()
    {
        var dictionary = new Dictionary<int,Person>(); 
        var d = dictionary.FirstOrDefault(); 
        if (d != null) {
            Console.WriteLine("key = " + d.Key + " value = " + (d.Value == null? "null" : "not null"));
        }
    }
}

これはコンパイルエラーです。

f:id:rimever:20200420182815p:plain
nullは返ってこない

では値が存在しない場合って、キーは何になっているんだ?

f:id:rimever:20200420182913p:plain
キーは0、値はnullとなっている

キーは0になるようです。

値はクラスであるならnullとなるようです。

そのため、もし無効な値がなんであるかを調べたい場合は、Valueがnullであるかを判定すれば良さそうです。