Есть ли способ ограничить параметр типа ЛИБО ссылочным типом ИЛИ типом значения NULL? - PullRequest
1 голос
/ 08 июля 2010

Было бы хорошо, если бы я мог определить метод, подобный этому:

public T GetItem<T>() where T : null
{
    if (someCondition<T>())
        return someCalculation<T>();
    else
        return null;
}

Тогда я мог бы использовать это для ссылочных типов (например, object, string) , а также для типов значений, допускающих значение Nullable (например, int?, double?): все, что может быть присвоено null. Но это невозможно.

Опять же, насколько я знаю, может быть, это так? Я знаю, что нет никаких ограничений, о которых я только мечтал; но есть ли какой-то обходной путь или умный способ сделать это, что мне просто не пришло в голову?

Ответы [ 3 ]

2 голосов
/ 08 июля 2010

Лично я бы создал два перегруженных универсальных метода: один, который принимает ссылочные типы, и другой, который принимает типы значений, допускающие значение NULL.Тогда вы сможете вызывать с любым параметром.

1 голос
/ 08 июля 2010

Раньше я никогда не использовал выходные параметры, отчасти я думаю, что синтаксис просто неуклюжий. Однако несколько лет назад я начал больше их использовать, и они стали общим аспектом кода, который я пишу.

Я думаю, что это та функция, в которой я действительно хотел бы написать функцию с выходным параметром и логическим типом возврата, как показано ниже:

public bool GetItem<T>(out T value)
{
    if (someCondition<T>())
    {
        value = someCalculation<T>();
        return true;
    }
    else
    {
        value = default(T);
        return false;
    }
}

При таком подходе нет необходимости ограничивать ваш универсальный параметр ссылочным типом или обнуляемым типом.

Как я упоминал выше, я изначально чувствовал, что синтаксис выходного параметра был неуклюжим, но после того, как я действительно начал часто его использовать, я почувствовал, что код, который потребляет мои функции с выходными параметрами, на самом деле был более точным в представлении проблемы, которую я пытался решить, если это имеет смысл.

0 голосов
/ 08 июля 2010

Это будет зависеть от общего использования в методах someCondition и someCalculation.Но это похоже на то, где можно использовать ключевое слово «по умолчанию».

return default(T);
...