Было много вопросов относительно поддержки ссылочных типов, не допускающих значения NULL, в .NET. Большую надежду возлагали на контракты кода, но они ограничиваются проверкой времени выполнения для тех, у кого ограниченный бюджет.
Что касается подходов, отличных от кодовых контрактов, Джон Скит написал сообщение в блоге несколько лет назад, и один из комментаторов представил полезную на вид ненулевую структуру , которая имела IL изменен, чтобы отключить конструктор по умолчанию. Это кажется отличным подходом, и я могу представить его расширение для предоставления всех видов микротипов , не допускающих значения NULL . Манипуляция IL может быть этапом после сборки, запускаемым атрибутом в структуре, например.
//Microtype representing a non-zero age, so we want to disable the default ctor
[NoDefaultConstructor]
public struct Age
{
public Age(int age)
{
// Implementation (including validation) elided
}
}
Прежде чем я исследую это дальше, я хотел бы спросить, знает ли кто-нибудь о каких-либо проблемах, которые это может вызвать? Я ничего не мог придумать.