2010-09-23 4 views
6

Les unions discriminées et les autres types primitifs dans F # utilisent l'égalité structurelle par défaut et fournissent un remplacement généré pour la méthode .Equals. L'opérateur d'égalité F # diffère apparemment du C# en ce qu'il utilise la méthode .Equals même pour les types de référence, mais lorsque les unions discriminées F # sont utilisées depuis C#, l'opérateur par défaut == est utilisé, qui vérifie l'égalité de référence plutôt que égalité structurelle. Pourquoi F # ne génère-t-il pas un opérateur personnalisé == pour les types d'union discriminés, de sorte que == donne le comportement attendu lorsqu'il est utilisé dans d'autres langages .NET?Pourquoi F # ne fournit-il pas une surcharge personnalisée pour l'opérateur ==?

Répondre

1

Un tel comportement est défini par le langage que vous utilisez et non par la langue d'origine du type que vous utilisez.

+0

Mais sûrement, == l'opérateur doit être considérée comme un concept .NET plutôt que d'un concept C# et F # doit jouer bien avec le reste de .NET ... – SoftMemes

+0

L'opérateur '==' est un Chose C# Ils ont utilisé des noms différents ('=' vs '==') précisément parce qu'ils font des choses différentes, et il est hérité de OCaml qui a fait cela. –

+0

@Jon - bien que cela soit vrai, l'équipe F # s'est assurée que les opérateurs arithmétiques communs fonctionnent à travers les langages (par exemple '(+)' est traduit en 'op_Addition', ce que C# reconnaît). Ils auraient pu générer une méthode 'op_Equality' aussi facilement. – kvb

0

Je ne suis pas dans l'équipe F #, donc je ne peux que spéculer, mais voici quelques raisons possibles:

  1. Si vous voulez utiliser l'égalité structurelle de l'intérieur C#, vous pouvez simplement utiliser le Equals méthode. C# fournit des moyens de tester deux types distincts d'égalité - pourquoi F # devrait-il les obliger à se comporter de la même manière alors qu'un utilisateur préférerait peut-être utiliser l'égalité de référence?
  2. Si vous voulez forcer C# à utiliser l'égalité structurelle, il est facile de le faire vous-même:

    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. Il y a un coût de développement à une fonction, même s'il y avait un avantage évident de générer automatiquement un op_Equality, il a peut-être été abandonné en faveur des fonctionnalités de priorité supérieure.

+0

1. Oui, mais == n'est pas toujours l'égalité de référence, object.ReferenceEquals est. C# utilise l'égalité des valeurs pour == où cela a du sens, comme pour les chaînes (qui est un type de référence mais fait une comparaison de valeurs lors de l'utilisation de ==). – SoftMemes

+0

Fait intéressant, selon Reflector, 'Object.ReferenceEquals' appelle simplement' == '. –

+0

@Joel - c'est bien comme, puisque les arguments sont statiquement typés en tant qu'objet, ce qui signifie que l'opérateur == acceptant les objets sera toujours utilisé, même si le type d'exécution est quelque chose de complètement différent. – SoftMemes

Questions connexes