Прямое сравнение типов значений C # - PullRequest
5 голосов
/ 03 июня 2011

Я прочитал следующее утверждение относительно сравнения типов значений C # в C # в Depth, Second Edition несколько раз.

стр. 77,

Когда параметр типабез ограничений (к нему не применяются никакие ограничения), вы можете использовать операторы == и! =, но только для сравнения значения этого типа с нулевым значением.Вы не можете сравнивать два значения типа T друг с другом.

...

Когда параметр типа ограничен типом значения, == и! = Нельзяиспользуется с ним вообще.

Если я правильно понимаю (я так не думаю), это в основном говорит мне, что вы не можете использовать == или! = для сравнения двух типов значений.Почему, почему, почему?

Будет лучше, если для этого случая можно привести простой пример.Может кто-нибудь подсказать мне, что пытается передать приведенный выше абзац?

Ответы [ 2 ]

7 голосов
/ 03 июня 2011

Это просто означает это при ограничении на тип значения (второй абзац)

static bool TryToCompare<T>(T first, T second) where T : struct
{
    return first == second; // not legal
    return first.Equals(second); // legal
}

Без ограничения типа-значения для универсального, это также говорит это (первый абзац)

static bool TryToCompare<T>(T first, T second) 
{
    return first == second; // not legal
    return first == null; // legal
    return first.Equals(second); // legal
}

Если вы ограничите T ссылочным типом, вы можете обойтись с помощью ==

static bool TryToCompare<T>(T first, T second) where T : class
{
    return first == second; // legal
    return first == null; // legal
    return first.Equals(second); // legal
}
0 голосов
/ 03 июня 2011

Объекты несопоставимы, потому что сравнение с использованием == проверяет, является ли ссылка одинаковой (адрес памяти).Обычно вы используете if (string1.Equals (string2)).

Что-то, чего я не понимаю, это то, что я видел обстоятельства, когда == работает со строками, и обстоятельства, где это не так.

...