2010-09-23 15 views
6

I sindacati discriminati e altri tipi primitivi in ​​F # utilizzano l'uguaglianza strutturale per impostazione predefinita e forniscono un override generato per il metodo .Equals. L'operatore di uguaglianza F # differisce da C# in quanto utilizza il metodo .Equals anche per i tipi di riferimento, ma quando vengono utilizzati i sindacati discriminati F # da C#, viene utilizzato l'operatore predefinito == per oggetto, che controlla l'uguaglianza di riferimento anziché uguaglianza strutturale.Perché F # non fornisce un sovraccarico personalizzato per l'operatore ==?

Perché F # non genera un operatore personalizzato == per i tipi di unione discriminati in modo che == fornisca il comportamento previsto quando viene utilizzato in altri linguaggi .NET?

risposta

1

Tale comportamento è definito dalla lingua che si sta utilizzando e non dalla lingua di origine del tipo che si sta utilizzando.

+0

Ma sicuramente, operatore == deve essere visto come un concetto NET piuttosto che un # concept C e F # ha bisogno di bel gioco con il resto del .NET ... – SoftMemes

+0

L'operatore '==' è un C# cosa Hanno usato nomi diversi ('=' vs '==') proprio perché fanno cose diverse, ed è ereditato da OCaml che lo ha fatto. –

+0

@Jon - mentre è vero, il team F # ha fatto in modo che gli operatori aritmetici comuni funzionassero attraverso le lingue (ad esempio '(+)' viene tradotto in 'op_Addition', che è ciò che C# riconosce). Avrebbero potuto generare un metodo 'op_Equality' altrettanto facilmente. – kvb

0

io non sono il # team di F, quindi posso solo speculare, ma qui ci sono un paio di possibili motivi:

  1. Se si desidera utilizzare l'uguaglianza strutturale all'interno di C#, si può semplicemente utilizzare il Equals metodo. C# fornisce dei modi per testare due distinti tipi di uguaglianza - perché F # dovrebbe costringerli a comportarsi nello stesso modo quando un potrebbe preferire essere in grado di usare l'uguaglianza di riferimento?
  2. Se si vuole forzare C# per usare l'uguaglianza strutturale, è facile farlo da soli:

    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. C'è un costo di sviluppo per qualsiasi funzione, quindi, anche se ci fosse un evidente beneficio per la generazione automatica di un op_Equality, potrebbe essere stato rilasciato a favore di funzionalità con priorità più alta.

+0

1. Sì, ma == non è sempre l'uguaglianza di riferimento, oggetto.ReferenceEquals è. C# usa l'uguaglianza di valore per == dove ha senso, ad esempio per le stringhe (che è un tipo di riferimento ma esegue un confronto di valori quando si usa ==). – SoftMemes

+0

È interessante notare che, secondo Reflector, 'Object.ReferenceEquals' chiama semplicemente' == '. –

+0

@Joel: va bene così, dato che gli argomenti sono tipizzati staticamente come oggetto, il che significa che l'operatore == accetta gli oggetti sarà sempre usato, anche se il tipo di runtime è qualcosa di completamente diverso. – SoftMemes

Problemi correlati