Мой вопрос;Есть ли способ заставить 'Foo bar4 = null' работать, или это просто ограничение языка (я не могу добавить оператор 'null' или сказать ему, какой использовать, например, для null)?
Основываясь на этом вопросе и ваших изменениях, вы в основном спрашиваете
Почему Foo bar4 = null
компилируется, если нет, если я добавляю еще один неявный оператор приведения?
Ответ прост.null
без какого-либо контекста не содержит типов, поэтому компилятор не знает, какой оператор использовать.Зачем?Хорошо, алгоритм разрешения перегрузки, лежащий в основе языка, не проверяет тип того, что вы пытаетесь присвоить null
, поэтому он не знает, какой оператор вы намеревались.
Вы можете утверждать, что будущий языкСпецификация может быть изменена для выполнения этого дополнительного анализа, но команда, вероятно, считает, что это не стоит усилий, или это будет серьезное изменение.
Лучшее, что вы можете сделать, - это избежать кастинга в этом случае.Вы можете, в зависимости от вашего уровня C #, выполнить одно из следующих действий:
Foo bar4 = default;
Foo bar4 = default(Foo);
, в результате чего можно использовать Foo
.Два выражения по умолчанию и new Foo()
все эквивалентны.Все они приводят к структуре со всеми обнуляемыми полями.
Для получения дополнительной информации вы можете увидеть выражения значений по умолчанию в руководстве по программированию на C #.
И, наконец,в то время как вы можете обойтись без единого неявного оператора приведения, который преобразует null
в структуру, это не означает, что вы должны .Кто-то, читающий этот код, не знающий об актерах, вероятно, подвергнет сомнению их здравомыслие в течение нескольких минут.Лучше не уходить от идиоматического кода, если можете.