2009-06-17 9 views
0

sind Ok, so dass dies mich verrückt macht. Wie kann dieser Code möglicherweise nicht funktionieren?Wörterbuch nicht finden Schlüssel, die bei der Verwendung von F #

open System.Collections.Generic 
type testing (a:int)= 
    let test = [Empty] 
    member p.GetHashCode = 
     fun() -> printfn "called hash";0 

    override p.Equals(other:obj) = 
     printfn "called equals" 
     true 
    interface IEquatable<testing> with 
     override p.Equals(other:testing) = 
      true 
    static member op_Equality (other:obj) = printfn "called op" ;true 
let dict2 = new Dictionary<testing,int>() 
dict2.[(testing 50)] <- 50 
dict2.[(testing 50)] 

Das Snippet stirbt beim Versuch, aus dem Wörterbuch zu holen, und ruft keine der bereitgestellten Methoden auf. Bin ich heute einfach verrückt oder stimmt hier etwas nicht?

Antwort

7

Sie haben den Modifikator override nicht unter p.GetHashCode (im Gegensatz zu p.Equals) verwendet. Mein F # -fu fehlt, aber das hört sich für mich schlecht an. Wird "Hash" ausgegeben? Wenn nicht, wäre das der Grund, ich vermute stark ...

+0

mann du bist sooo richtig. Ich habe jetzt schon seit zwei Stunden meinen Kopf gegen die Wand geschlagen, sehr viel. kann nicht glauben, dass ich das nicht gesehen habe – LDomagala

+4

Beachten Sie auch, dass Ihr GetHashCode-Mitglied tatsächlich als eine Eigenschaft definiert ist, die eine Nullfunktion zurückgibt. Wenn es stattdessen eine Methode wäre (definiert als 'p.GetHashCode()' und den 'fun() ->' Teil unten weglässt), erhalten Sie tatsächlich eine Warnung, dass Sie die Basisimplementierung verstecken, anstatt sie zu überschreiben. – kvb

Verwandte Themen