У меня есть приложение для обработки данных в псевдо-реальном времени, в котором я хотел бы использовать LazyInit<double>, поэтому я не делаю ненужных вычислений, но LazyInit<T> ограничивает T классами. Я могу обойти это, но, очевидно, предпочел бы этого не делать.
Кто-нибудь знает, почему это так?





Я считаю, что это связано с тем, что типы значений автоматически инициализируются, а LazyInit определяет, нужно ли что-то инициализировать, в зависимости от того, является ли оно нулевым или нет. Вы можете обойти это, используя типы, допускающие значение NULL.
LazyInit<double?>
Если только значения NULL не включены в ограничения, нет?
Причина в том, что LazyInit. Он использует Interlocked.CompareExchange, чтобы установить потокобезопасный набор значений. CompareExchange, в то время как generic ограничивается использованием только типов классов. Следовательно, значение T LazyInit также должно быть классом.
Вы можете просмотреть реализацию здесь: LazyInit
Наши текущие (предварительные) биты предоставляют только тип LazyInit, и, как вы заметили (и JaredPar правильно диагностировал), мы ограничиваем T ссылочными типами, чтобы мы могли: (i) сделать LazyInit структурой и (ii) обеспечить разумное поведение по умолчанию с помощью CMPXCHG (т. Е. Мы можем проверить, что «ноль» означает отсутствие значения). Мы могли бы сделать T неограниченным, но решили оптимизировать для общего случая - иначе потребовалось бы несколько дополнительных байтов; Хотите верьте, хотите нет, но это могло сделать этот шрифт слишком дорогим для некоторых людей.
Недавно мы немного изменили курс. В настоящее время мы планируем предложить тип LazyInit, где T не ограничен Кроме того, до типа LazyInitField, где T ограничен ссылочными типами. Первое - это то, что будет использовать большинство людей, но второе можно использовать для тех, кто осознает производительность и может жить с ограничениями на T.
Надеюсь, это проясняет ситуацию. Ваше здоровье,
--- Джо Даффи, ведущий разработчик pfx
Если существует ограничение T: class, то он не будет удовлетворен типом значения, допускающим значение NULL.