Проверка нулей на универсальные типы

Я хотел создать функцию, которая будет проверять значение параметра, если он равен нулю, он должен устанавливать значение в зависимости от типа параметра, иначе он должен просто возвращать значение как есть.

Вот что я попробовал.

public static T ConvertNull<T>(T obj)
{
    if (String.IsNullOrEmpty(obj.ToString()))
    {
        HttpContext.Current.Response.Write("COMING IN");
        if (typeof(T) == typeof(Int32))
        {
            return (T)Convert.ChangeType(0, typeof(T));
        }
        else if (typeof(T) == typeof(DateTime))
        {
            return (T)Convert.ChangeType(DateTime.Now, typeof(T));
        }
        else
        {
            return (T)Convert.ChangeType(String.Empty, typeof(T));
        }
    }
    else
    {
        HttpContext.Current.Response.Write("ELSE");
        return obj;
    }
}

Но проблема в том, что он всегда входит в раздел ELSE и возвращает значение Junk.

Может кто-нибудь сказать мне, что не так с вышеуказанной функцией.

2 ответа

Если у вас есть обнуляемый тип, который вы хотите заменить на какое-либо значение в случае, если оно равно нулю, и вернуть существующее значение в том случае, если оно не равно нулю, существует уже существующий оператор, который делает это, ?? оператор:

int? i = null;  //note of course that a non-nullable int cannot be null
int n = i ?? 0; //equals zero

string s = null;
string s2 = s ?? ""; //equals an empty string

string s3 = "hi";
string s4 = s3 ?? ""; //equals "hi"

Удобно ?? Оператор даже не скомпилируется в случае, если тип первого операнда не обнуляется.

String.IsNullOrEmpty(obj.ToString()) очень редко будет true, Единственное, о чем я могу думать, это сгенерирует пустую строку. Vi ToString() - это еще одна пустая строка. На самом деле, если ToString() был переопределен (как это было для нативных типов, таких как DateTime а также int, вы получите полное имя объекта.

может ты хочешь

if (obj == default(T))

?

Другие вопросы по тегам