2015-12-03 4 views
0

Я пытаюсь написать версию «TryGetValue» с опциональной версией, которая будет работать на любом объекте, который реализует IDictionary или IReadOnlyDictionary. У меня есть это:Статическое ограничение по элементу

let inline contains (key:^key) (dictionary:^dic)= 
    (^dic: (member ContainsKey: ^key -> bool) (dictionary, key)) 

let inline tryGetValue (dictionary:^dic) (key:^key)= 
    if contains key dictionary then 
     let value = (^dic : (member get_Item: ^key -> ^value) (dictionary, key)) (dictionary)) key 
     value |> Some 
    else None 

Определение «значение» выдаст предупреждение, что ограничения членов с именем get_Item имеют особый статус, который может привести к ошибкам во время выполнения. Что я должен здесь делать?

ответ

3

Как насчет использования TryGetValue вместо ContainsKey и Item?

let inline tryGetValue dic key = 
    let mutable value = Unchecked.defaultof< ^value> 
    let contains = (^dic : (member TryGetValue : ^key * byref< ^value> -> bool) (dic, key, &value)) 
    if contains then Some value else None 
+0

Я начал так, и это было именно то, «Unchecked.defaultof <^value>» или точнее мой, не зная, что это было, что заставило меня остановиться. Не будет ли много типов, которые вызовут исключение, потому что у них нет значения по умолчанию? – MatthewJohnHeath

+2

@MatthewJohnHeath Все типы имеют значение по умолчанию, оно равно null для ссылочных типов, а значение по умолчанию для структуры - это значение, созданное путем установки всех полей типа значения в их значение по умолчанию, а все поля ссылочного типа равны null. – TheInnerLight

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