Как использовать Nullable <T>, если T - тип arg? - PullRequest
3 голосов
/ 09 октября 2011
class Test<T>
{
    T? obj;
}

Ошибка:

Тип 'T' должен быть типом значения, не допускающим значения NULL, чтобы использовать его в качестве параметра 'T' в универсальном типе или методе 'System.Nullable.'

Мне нужно сохранить возможно нулевую ссылку на тип T, но T может быть либо типом значения, либо ссылочным типом, и вы не можете иметь Nullable<T>, если T является ссылочным типом.,Любое решение?

Ответы [ 2 ]

12 голосов
/ 09 октября 2011

Обнуляемыми могут быть только типы значений (ссылочные типы по своей природе уже обнуляются).Таким образом, вы можете применить то же родовое ограничение, что и класс Nullable<T>:

class Test<T> where T: struct
{
    T? obj;
}

, что, конечно же, равно:

class Test<T> where T: struct
{
    Nullable<T> obj;
}

и иллюстрирует, чтоуниверсальный аргумент должен удовлетворять тем же ограничениям.

0 голосов
/ 10 октября 2011

Если вам нужно поддерживать оба класса и структуры внутри Test<T>, вы не можете использовать ограничение where T : struct и не сможете напрямую поддерживать T?, хотя вы можете достичь желаемого эффекта с помощью семантики из того, что T? делает.

class Test<T>
{
    T obj;
    bool hasValue; 
}

Так что, где бы вы использовали obj, вы сначала проверите hasValue, чтобы увидеть, находится ли он в пригодном для использования состоянии («ненулевое»).

Вы можете пойти еще дальше и инкапсулировать это, чтобы по сути свернуть свою собственную обнуляемую оболочку (возможно, вложив ее в Test, чтобы не сделать ее частью публично видимого API) для поддержки как классов, так и ссылочных типов. Хотя он будет избыточным, он объединит в настоящее время отдельные понятия нулевого класса и нулевой структуры.

...