Почему F # не предоставляет настраиваемую перегрузку для оператора ==? - PullRequest
7 голосов
/ 23 сентября 2010

Дискриминационные объединения и другие примитивные типы в F # по умолчанию используют структурное равенство и предоставляют сгенерированное переопределение для метода .Equals. Очевидно, что оператор равенства F # отличается от оператора C # тем, что он использует метод .Equals даже для ссылочных типов, но когда из C # используются различимые объединения F #, используется оператор по умолчанию == для объекта, который проверяет равенство ссылок, а не структурное равенство.

Почему F # не генерирует пользовательский оператор == для различающихся типов объединений, так что == дает ожидаемое поведение при использовании в других языках .NET?

Ответы [ 2 ]

1 голос
/ 23 сентября 2010

Такое поведение определяется языком, который вы используете, а не языком происхождения того типа, который вы используете.

0 голосов
/ 23 сентября 2010

Я не в команде F #, поэтому я могу только строить догадки, но вот несколько возможных причин:

  1. Если вы хотите использовать структурное равенство из C #, вы можете просто использоватьметод Equals.C # предоставляет способы проверки на два различных вида равенства - почему F # заставляет их вести себя одинаково, когда кто-то может предпочесть использовать ссылочное равенство?
  2. Если вы хотите форсировать C #Чтобы использовать структурное равенство, легко сделать это самостоятельно:

    type T = A | B of int with
      static member op_Equality(t:T,t2:T) = t = t2
      // or even static member (=)(t:T, t2:T) = t = t2
    
  3. Для любой функции есть затраты на разработку, так что даже если бы была автоматическая генерация op_Equality, было бы явное преимущество, он мог быть отброшен в пользу более приоритетных функций.

...