Перечисления являются структурами и, следовательно, размещаются в стеке, в то время как распознаваемые объединения являются ссылочными типами, поэтому выделяется куча. Таким образом, вы ожидаете, что DU будет немного менее производительным, чем перечисления, хотя в действительности вы, вероятно, никогда не заметите эту разницу.
Что еще более важно, дискриминируемое объединение может быть только одним из объявленных типов, где перечисления на самом деле просто целые числа, так что вы можете привести целое число, которое не является членом перечисления, к типу перечисления Это означает, что когда сопоставление с образцом компилятор может утверждать, что сопоставление с образцом завершено, когда вы рассмотрели все случаи для DU, но для перечисления вы должны всегда помещать в перехват по умолчанию все остальные случаи, то есть Вам всегда нужно сопоставление с образцом, например:
match enumColor with
| Red -> 1
| Green -> 2
| Blue -> 3
| _ -> failwith "not an enum member"
где в последнем случае нет необходимости с DU.
И последний момент, поскольку перечисления изначально поддерживаются как в C #, так и в VB.NET, а в отличие от DU, перечисления часто являются лучшим выбором при создании общедоступного API для использования другими языками.