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
Un tel comportement est défini par le langage que vous utilisez et non par la langue d'origine du type que vous utilisez.
Je ne suis pas dans l'équipe F #, donc je ne peux que spéculer, mais voici quelques raisons possibles:
- 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? 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
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.
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
Fait intéressant, selon Reflector, 'Object.ReferenceEquals' appelle simplement' == '. –
@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
- 1. F #: fonctions de surcharge
- 2. Pourquoi cela ne compilera pas en F #
- 3. Surcharge des constructeurs dans F #
- 4. Opérateur de surcharge dans F #: (/)
- 5. Pourquoi cette << surcharge ne compile-t-elle pas
- 6. pourquoi C# ne permet pas la surcharge de l'opérateur?
- 7. Erreur CS1501: Je ne surcharge pas correctement une méthode Sum()
- 8. Les fondations de l'exemple F # ne compilent pas, pourquoi?
- 9. F # opérateur de recherche dynamique surcharge
- 10. Pourquoi yahoo pipes ne récupère-t-il pas une URL personnalisée pour freelancer.com?
- 11. Pourquoi ne puis-je pas définir une couleur personnalisée pour UINavigationBar?
- 12. F #: Pourquoi dois-je spécifier explicitement 'unit' pour les fonctions ne prenant pas d'argument?
- 13. Pourquoi est-ce que je ne peux pas obtenir mapkit pour afficher une image de broche d'annotation personnalisée?
- 14. F # - Ce code ne compile pour moi
- 15. C++ Unaire - La surcharge de l'opérateur ne se compile pas
- 16. .htaccess! -f règle ne fonctionne pas
- 17. F # quelque chose ne va pas
- 18. Pourquoi ListBox.Items.IsReadOnly = true? (F #/Silverlight)
- 19. kCGBlendModeClear ne s'efface pas, pourquoi?
- 20. Pourquoi ne puis-je pas obtenir une valeur retournée par ma classe personnalisée?
- 21. Pourquoi ma jquery ne fonctionne pas pour une balise span?
- 22. Pourquoi ne puis-je pas interroger SolrJ pour une URL?
- 23. Pourquoi ptr_fun (tolower) ne compile pas dans mingw?
- 24. validation jQuery méthode personnalisée ne fonctionne pas
- 25. Pourquoi @Table ne fonctionne pas pour moi?
- 26. Pourquoi nerdcommenter ne fonctionne pas pour moi
- 27. Pourquoi preventDefault ne fonctionne pas pour jQuery?
- 28. Pourquoi innerHTML ne fonctionne pas pour moi?
- 29. La surcharge d'un opérateur ami C++ ne se compile pas
- 30. expression ne fonctionne pas dans f: facet? JSF
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
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. –
@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