Думайте о MB_ICONEXCLAMATION и MB_OK как о «опциях», которые ничем не отличаются от целых. Что вас волнует, так это битовое представление этих целых.
Скажи:
//MessageBox.cs or whatever
public static int MB_ICONEXCLAMATION = 0x1 // 0001 in binary
public static int MB_OK = 0x2 // 0010 in binary
Когда вы ИЛИ их вместе, вы получаете 0011 в двоичном виде. Таким образом, вы запрашиваете обе опции для MessageBox, используя только один аргумент вместо того, чтобы иметь больше аргументов, по одному для каждой опции, которую вы хотите указать.