Здравствуйте, CodeMonkey, Вы писали:
CM>Есть ли в .NET какая-то возможность присвоить null переменной, объявленой как "ref SomeStruct myVariable = "?
Обычно тема начинается с объяснения зачем это нужно
null нельзя присвоить и обычной структуре, не то что ref struct.
System.Nullable не считается потому как компилятор раскрывает это в инициализацию, а не в присвоение null.
Здравствуйте, CodeMonkey, Вы писали:
CM>Здравствуйте, _NN_, Вы писали:
_NN>>Обычно тема начинается с объяснения зачем это нужно
CM>Затем же, зачем нужен "SomeStruct?" CM>Всё разжевывать нужно?
Хотите ответа на вопрос, тогда да.
_NN>>null нельзя присвоить и обычной структуре, не то что ref struct.
CM>И с каких пор ссылке нельзя присвоить null?
А где у нас тут ссылочный тип ?
struct , ref struct не создают ссылочного типа.
Для этого есть ключевое слово class.
Также у ref struct отсутствует боксинг . https://blogs.msdn.microsoft.com/mazhou/2018/03/02/c-7-series-part-9-ref-structs/
Здравствуйте, CodeMonkey, Вы писали:
CM>Есть ли в .NET какая-то возможность присвоить null переменной, объявленой как "ref SomeStruct myVariable = "
Ессессно. Стреляйте себе в ногу: ref SomeStruct myVariable = Null<SomeStruct>();
static unsafe ref T Null<T>() where T : unmanaged => ref *(T*)null;
Не знаю, зачем такое может понадобиться, но всёж.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, CodeMonkey, Вы писали:
CM>Здравствуйте, _NN_, Вы писали:
_NN>>Хотите ответа на вопрос, тогда да.
CM>Если человек не знает, зачем нужен SomeStruct?, то на мой вопрос он все равно не сможет ответить.
Так нужен null или просто обозначить отсутствие значения ?
SomeStruct? => struct Nullable<SomeStruct> , а следовательно не является ссылочным типом.
Вы точно знаете, что на самом деле происходит в коде: SomeStruct? a = null; ?
_NN>>А где у нас тут ссылочный тип ?
CM>Внутри. По сути, это просто специальный тип ссылки.
На то он и специальный, чтобы не было глупостей:
Здравствуйте, _NN_, Вы писали:
_NN>Вы точно знаете, что на самом деле происходит в коде: SomeStruct? a = null; ?
Ты точно уверен, что понял написанное?
ref SomeStruct — это, по своей сути, специальный вид ссылки/указателя. А раз это ссылка, то сделать ее null никаких технических сложностей быть не должно.
Здравствуйте, _NN_, Вы писали:
_NN>Кстати есть уже пара предложений на эту тему. Возможно сделают в будущем:
Судя по комментариям — вряд ли. У идиотов всегда или всё, или ничего. Раньше была концепция "null должен быть везде", ну а сейчас, похоже, это сменилось на "null никогда не нужен".
Здравствуйте, CodeMonkey, Вы писали:
CM>Это вы без меня развлекайтесь подобным образом.
Эмм, а что вас не устраивает? Вы хотели null в ref local — вот вам способ впаять туда null.
Понятно, что ту задачу, которая перед вами на самом деле стоит, нужно решать как-то по-другому, но т.к. вы её не обозначили, то решение вам дано ровно для того, для чего просили.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, CodeMonkey, Вы писали:
CM>Здравствуйте, _NN_, Вы писали:
_NN>>Кстати есть уже пара предложений на эту тему. Возможно сделают в будущем:
CM>Судя по комментариям — вряд ли. У идиотов всегда или всё, или ничего. Раньше была концепция "null должен быть везде", ну а сейчас, похоже, это сменилось на "null никогда не нужен".
И правильно.
Отсутствие значения должно быть обозначено явно.
Здравствуйте, CodeMonkey, Вы писали:
CM>Здравствуйте, mDmitriy, Вы писали:
D>>
D>>myVariable = default(SomeStruct);
D>>
D>>не?
D>>PS. не null, конечно, но я таким пользуюсь иногда
CM>Не. В данном случае, нужно потом суметь отличить — null это или нет.
не нужно, потому что структуы в текущей реализации шарпа не бывают null
чтобы отличить пустую структуру, достаточно сравнить ее с default(SomeStruct)
и сразу будет понятно, было присвоено что-то ссылочному параметру внутри метода или нет
Здравствуйте, CodeMonkey, Вы писали:
CM>Здравствуйте, _NN_, Вы писали:
_NN>>И правильно. _NN>>Отсутствие значения должно быть обозначено явно.
CM>Даешь логику на исключениях или добавочные флаги?
Сразу на монадах
Семантически должно быть различие, а не как изначально ссылочные типы могут быть и со значением и без.
Пусть внутри будет реализовано оптимально через ссылку с null, но это должно быть в деталях реализации.
Здравствуйте, Sinclair, Вы писали:
S>Не знаю, зачем такое может понадобиться, но всёж.
Для интеропа часто использую.
Интероп требует передавать структуры по указателю в некое АПИ, но:
— иногда хочется оставить их value-типами;
— иногда требуется подать NULL;
— раскидывать unmanaged/fixed повсюду не хочется.