Если вам нужно поддерживать оба класса и структуры внутри Test<T>
, вы не можете использовать ограничение where T : struct
и не сможете напрямую поддерживать T?
, хотя вы можете достичь желаемого эффекта с помощью семантики из того, что T?
делает.
class Test<T>
{
T obj;
bool hasValue;
}
Так что, где бы вы использовали obj
, вы сначала проверите hasValue
, чтобы увидеть, находится ли он в пригодном для использования состоянии («ненулевое»).
Вы можете пойти еще дальше и инкапсулировать это, чтобы по сути свернуть свою собственную обнуляемую оболочку (возможно, вложив ее в Test
, чтобы не сделать ее частью публично видимого API) для поддержки как классов, так и ссылочных типов. Хотя он будет избыточным, он объединит в настоящее время отдельные понятия нулевого класса и нулевой структуры.