В соответствии с документацией as operator, as "используется для выполнения определенных типов преобразований между совместимыми ссылочными типами". Поскольку Nullable на самом деле является значением), я бы ожидал, что as не будет работать с ним. Однако этот код компилируется и запускается:
object o = 7;
int i = o as int? ?? -1;
Console.WriteLine(i); // output: 7
Это правильное поведение? Не соответствует ли документация для as? Я что-то пропустил?