Почему я могу объявить структуру ref как член класса в c # 7.3? - PullRequest
2 голосов
/ 21 июня 2019

Согласно документам :

Вы не можете объявить ссылку на структуру как член класса или обычную структуру.

Но мне удалось скомпилировать и запустить это:

public ref struct RefStruct
{
    public int value;
}
public class MyClass
{
    public RefStruct Item => default;
}    
...       

MyClass c = new MyClass();
Console.WriteLine(c.Item.value);

Теперь RefStruct - это ref struct, и он является членом класса.Является ли это утверждение неверным в некоторых случаях?

ОБНОВЛЕНИЕ Теперь документы обновлены до более точного описания.

1 Ответ

3 голосов
/ 21 июня 2019

Это не поле вашего класса, а возвращаемое значение получателя свойства - это хорошо, так как это просто возвращаемое значение функции.

Обратите внимание, что "как член класса" обычно включает свойства и, вероятно, должно быть изменено на "поле класса".

Если вы попытаетесь объявить его как поле класса (прямо или косвенно через автоматически реализуемое свойство), это потребует, чтобы часть класса (данные для ref struct) была размещена в стеке, а остальные - в управляемой куче.

Код в вопросе определяет неавтоматизированное свойство. В результате компилятору не нужно автоматически создавать скрытое поле типа свойства в классе. Таким образом, хотя тип результата свойства ref struct, он на самом деле не хранится в классе и, следовательно, не нарушает требования, чтобы этот тип ref struct не был включен ни в один класс. Обратите внимание, что даже создание метода сеттера было бы хорошо само по себе - сохранить значение для этого свойства было бы непросто, но вы можете безопасно хранить содержимое ref struct (public int value; как в посте) в set и воссоздать его в get.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...