Я пытаюсь реализовать массивы фиксированного размера в C #, которые параметризуются хакерскими числами уровня типа.См. GitHub
Я хочу реализовать метод, который бы работал следующим образом:
static ref T Ref(this ref TContainer container, int index)
where T: unmanaged
where TContainer: unmanaged
=> ref container[index];
Теперь проблема заключается в следующем: я знаю, что TContainer
внутренне состоитиз N полей типа T
.Но на самом деле он не реализует операцию индексации (или какой-либо другой интерфейс).
Я могу сделать следующее:
CheckIndex(index);
fixed (TContainer* self = &container) {
T* data = (T*)self;
return ref data[index];
}
Это компилируется с unsafe
, но у меня есть два вопроса:
- Будет ли правильно отслеживаться время жизни управляемой ссылки, полученной таким образом?
- Влияет ли использование
fixed
в этом контексте на производительность?(например, закрепление GC, проблемы с алиасами и т. д.)
Кроме того, пример с fixed
и return ref
сверху также компилируется, даже когда я заменяю тип параметра ref TContainer
просто TContainer
или, что должно быть одинаковым, просто объявите его как член экземпляра вместо метода расширения.Это даже работает в тестовом примере, но я не могу понять, почему это так, потому что в нормальных условиях нельзя возвращать ref this.field
из метода экземпляра struct.