Почему Resharper делает следующую рекомендацию? - PullRequest
7 голосов
/ 26 февраля 2009

Мой код ...

public static void AssertNotNull<T>(string name, T val) {
    if (val == null)
        throw new ArgumentNullException(String.Format("{0} must not be null", name));
}

Решарпер рекомендует ...

public static void AssertNotNull<T>(string name, T val) {
    if (Equals(val, default(T)))
        throw new ArgumentNullException(String.Format("{0} must not be null", name));
}

Ответы [ 6 ]

13 голосов
/ 26 февраля 2009

Поскольку он не знает, является ли T типом значения или ссылочным типом, он заставляет код работать с обоими.

12 голосов
/ 26 февраля 2009

Я второй ответ Берадо, но добавил бы, что вы можете предотвратить это, добавив следующее ограничение:

public static void AssertNotNull<T>(string name, T val) where T : class
2 голосов
/ 26 февраля 2009

Это, очевидно, не , что вы хотите в этом случае, но он просто пытается быть полезным, убедившись, что вы не вносите ошибку, забывая, что ссылочные типы могут использоваться для T. Как сказал @ Michael Meadows , вы, вероятно, хотите добавить ограничение class к T.

1 голос
/ 26 февраля 2009

Эти два метода не эквивалентны. Первый разрешает AssertNotNull ("foo", 0), а второй бросает. Я думаю, что Решарпер слишком усердствует в этом деле.

0 голосов
/ 26 февраля 2009

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

public static void AssertNotNull<T>(string name, T val)
    where T : class
    {
        if (val == null)
            throw new ArgumentNullException(String.Format("{0} must not be null", name));
    }
0 голосов
/ 26 февраля 2009

Я полагаю, потому что T может быть не ссылочным типом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...