Есть ли способ реализовать функцию TryGet, которая работает с ref-структурами?
Прямо сейчас у меня есть две функции, которые идут вместе:
bool HasX(int key) { ... }
ref S GetX(int key) { ... } // S is a struct
Они работают, но когда мне нужно проверить их существование перед вызовом функции get, ей нужно вычислить смещения в массивах и дважды проверить значения. Именно поэтому такие функции, какDictionary<TK, TV>.TryGetValue(TK key, out TV value)
существуют, поэтому необходим только один поиск.
Вещи, которые я пытался объединить их в один:
// ref S here has different semantics, I'm not able to set it to a ref structure handle
bool TryGetX(int key, ref S value)
// out S here has different semantics, it's a value copy for structs
bool TryGetX(int key, out S value)
// ref S here has different semantics, I'm not able to set it to a ref structure handle
bool TryGetX(int key, ref S value)
// copy again rather than reference
S? TryGetX(int key)
// equivalent to ref Nullable<S>, not Nullable<ref S>, so again not suitable
ref S? TryGetX(int key)
// this works, but it's backwards from normal, and I'm unable to write it cleanly
// as a condition, like: if(dict.TryGetValue(key, out var value)) { /* use value here */ }
ref S TryGetX(int key, out bool found)
// perhaps the cleanest so far, and return Unsafe.NullRef<S> for failure.
// still not idiomatic though
ref S TryGetX(int key)
Есть ли способ написать традиционныйTryGet
функция дляref
структуры?