Вот такой код:
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.