[BUG] match и nullable
От: hi_octane Беларусь  
Дата: 26.10.07 07:58
Оценка:
Вот такой код:
def a : int? = 10;
        
match(a)
{
  | null => WriteLine("is null!");
  //| 10 => WriteLine("ten (10)");  так вообще нельзя для nullable-типов, а почему?
  | x => WriteLine($"x = $x");
}

выводит, null при любых значениях a (сначала заподозрил, что хитрый немерл сделал bound null = a, но оказалось -- нет). Самое интересно начинается, если посмотреть в рефлектор -- там всё нормально, настолько что если скопипастить C#-код из рефлектора -- то будет работать как надо!

Похоже это всё-таки баг или недоработка match, потому что switch в C# работает в полном соответствии с ожиданиями:
int? a = 10;

switch(a)
{
  case null:
    Console.WriteLine("is null!");
    break;

  case 10:
    Console.WriteLine("ten (10)");
    break;

  default:
    Console.WriteLine("a = " + Convert.ToString(a));
    break;
}

Посмотрел в IL -- нашёл некоторые отличия, которые могут быть существенными -- Nemerle реально пытается сравнить с null значение a (при этом ещё и unbox вызывает, хотя не совсем понятно зачем), а C# -- обрабатывает case null отдельно, и использует для такого случая проверку через HasValue.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.