2009-06-17 2 views
0

Хорошо, так что это сводит меня с ума. как этот код может не работать?Словарь не находит ключи, которые вводятся при использовании 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)] 

Фрагмент умирает при попытке извлечь из словаря и не вызывает ни один из предоставленных методов. Я сейчас просто сумасшедший или здесь что-то не так?

ответ

7

Вы не использовали модификатор override на p.GetHashCode (в отличие от p.Equals). Мой F # -fu не хватает, но для меня это звучит плохо. Распечатывает ли он «называемый хэш»? Если нет, это было бы причиной, я сильно подозреваю ...

+0

человек, которого вы правы. Я уже два часа стуча головой о стену, много. cant belive, я не видел этого – LDomagala

+4

Также обратите внимание, что ваш член GetHashCode на самом деле определяется как свойство, которое возвращает возвратную функцию. Если бы это был метод (определяемый как «p.GetHashCode()» и опуская часть «fun() ->» ниже), вы действительно получите предупреждение о том, что вы скрываете базовую реализацию, а не переопределяете ее. – kvb

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