2010-09-23 3 views
6

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

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

ответ

1

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

+0

Но, конечно же, оператор == должен рассматриваться как концепция .NET, а не концепции C# и F # должен играть хорошо с остальной частью .NET ... – SoftMemes

+0

Параметр '' == оператор является C# предмет. Они использовали разные имена ('=' vs '==') именно потому, что они делают разные вещи, и это унаследовано от OCaml, который сделал это. –

+0

@Jon - в то время как это правда, команда F # удостоверилась, что общие арифметические операторы работают на разных языках (например, '(+)' переводится в 'op_Addition', что и распознает C#). Они могли бы сгенерировать метод 'op_Equality' так же легко. – kvb

0

Я не на # команда 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, возможно, он был отброшен в пользу функций с более высоким приоритетом.

+0

1. Да, но == не всегда ссылается на равенство, object.ReferenceEquals. C# использует значение равенства для ==, где это имеет смысл, например, для строк (это ссылочный тип, но делает сравнение значений при использовании ==). – SoftMemes

+0

Интересно, что, согласно Reflector, 'Object.ReferenceEquals' просто вызывает' == '. –

+0

@Joel - это прекрасно, поскольку аргументы статически типизируются как объекты, что означает, что оператор == принимает объекты всегда будут использоваться, даже если тип выполнения является чем-то совершенно другим. – SoftMemes

Смежные вопросы