Почему я не могу назначить ссылку на поле в той же структуре ссылки на поле ссылки?

Учитывая этот по большей части надуманный пример:

ref struct RefStruct {
    int _field;
    ref int _refField;

    void AssignRef() {
        _refField = ref _field;
        // CS8374 Cannot ref-assign '_field' to '_refField' because '_field' has a narrower escape scope than '_refField'.
    }
}

В документах говорится, что:

Компилятор гарантирует, что ссылка, хранящаяся в поле ref, не пережить своего референта.

Но при каких обстоятельствах ссылка на частное _field, хранящееся в _refField, переживет референт?

ref int evilVar = anInstanceOfStruct._refField; кажется, оно могло вот так убежать.
Charlieface 29.08.2024 04:08
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поле без ссылки существует до тех пор, пока существует экземпляр структуры, но поле ссылки может существовать до тех пор, пока существует область вызывающего объекта. Другими словами, обычные поля имеют ref-safe-контекст «члена функции», но ref-поля имеют ref-safe-контекст «контекста вызывающего абонента». Подробности смотрите в правилах здесь.

Другими словами, вы можете сделать это:

// in RefStruct...
public static ref int Foo() {
    var s = new RefStruct();
    return ref s._refField;
    // the lifetime of s ends here! But _refField is still living!
}

Тогда Foo можно вызвать так:

ref int foo = ref RefStruct.Foo();

Спасибо за пример. Технические характеристики, как всегда, очевидны, когда вы знаете ответ.

Ivan Petrov 29.08.2024 10:39

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