Во-первых, я бы не использовал небезопасный код для этого, если бы сначала не определил (1), что очевидный код с переключателем будет самый медленный код во всей программе и вызывает значительный пользовательский наблюдаемые замедления и то, что (2) переход к небезопасному коду устраняет проблему производительности.
Во-вторых, если бы я использовал небезопасный код, было бы чрезвычайно опасно делать предположения об упаковке структуры. CLR допускается широкая широта в способах упаковки конструкций. Если вы собираетесь делать эту опасную вещь, вам следует использовать атрибут struct layout, чтобы гарантировать, что числа с плавающей точкой находятся именно там, где вам нужно.
В-третьих, что мешает вызывающей стороне с ошибкой передать отрицательный индекс или слишком большой индекс?
Четвертое:
Является ли исправленное здесь избыточным?
Я не знаю, что означает "избыточные накладные расходы". "fixed" заставляет дрожание сообщать сборщику мусора "не перемещайте эту вещь, потому что мне нужно сделать арифметику с указателями на ней". Вы исправляете в течение короткого периода, который идеален; исправление в течение длительного времени повышает вероятность того, что коллекция будет испорчена, поскольку закрепленное хранилище не может быть перемещено.
Пятый:
Или, может быть, эта структура уже исправлена, и поэтому исправленная здесь не имеет никакого эффекта и необходима только для удовлетворения компилятора?
Может быть! Возможно, переменная, на которую указывает this, уже является фиксированной переменной. Возможно, это не так. Как компилятор должен знать, является ли "this" структуры ссылкой на фиксированное хранилище или нет? Мы должны предположить худшее, поэтому вы должны это исправить.