Есть ли способ реализовать функцию 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структуры?

0 ответов

Другие вопросы по тегам