Как решить Operator ‘! =’ Нельзя применить к операндам типа T и T

Этот fragment кода работает как ожидалось для типа int :

 public class Test { public int Value { get { return _Value; } set { if (_Value != value) { _Value = value; } } } private int _Value; } 

Когда int заменяется общим T , компилятор жалуется:

Оператор ‘! =’ Не может применяться к операндам типа ‘T’ и ‘T’

Почему это происходит и есть ли способ решить эту проблему?

 using System.Collections.Generic; public class Test { public T Value { get { return _Value; } set { // operator== is undefined for generic T; EqualityComparer solves this if (!EqualityComparer.Default.Equals(_Value, value)) { _Value = value; } } } private T _Value; } 

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

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

Если вы используете ключевое слово where чтобы добавить ограничение к аргументу типа, компилятор позволит вам использовать этот метод \ interface \ operator

сдерживать T как class

 public class Test where T : class { public T Value { private T _Value; get { return _Value; } set { if (_value != value) _Value = value; } } } 

Или просто используйте Equals вместо оператора ==

 public class Test { public T Value { private T _Value; get { return _Value; } set { if (!_value.Equals(value) _Value = value; } } } 

T может быть любым типом. Вы не можете использовать == / != On structs, если только такие операторы не определены в типе (struct).

  • Вывод общего типа C # 3.0 - передача делегата в качестве параметра функции
  • Каковы причины, по которым Map.get (Object key) не является (полностью) общим
  • Почему я не могу получить общее исключение в C #?
  • Внедрить общий макрос свопинга в C
  • Java Generics: недопонимание подстановочных знаков
  • Как добавить элементы в общую коллекцию подстановочных знаков?
  • В чем смысл дополнительного classа Guava?
  • Java Generics - метод Bridge?
  • Scala - метод ClassTag не доступен для T
  • Java generics - сделать Generic для расширения двух интерфейсов
  • Синтаксис и использование примера _Generic в C11
  • Interesting Posts

    Registry Cleaner, полезный или нет

    Более 4 первичных разделов на MacBook с rEFIt (синхронизация GPT / MBR)?

    Обложка Textview вокруг View

    как изменить цвет фокуса EditText в Android

    Почему этот файл, по-видимому, не существует при попытке удалить его?

    Какое ключевое слово yield используется для C #?

    Как использовать розничный лицензионный ключ для Windows 7 Professional для обновления установленной машины Windows 7 Home Premium

    Создавайте бесплатные / платные версии приложения из того же кода

    Что синхронизируется на компьютерах с использованием одного и того же идентификатора Windows Live ID?

    Как отключить autohotkeys для определенных программ

    Заказ файлов css и js, загруженных Meteor

    Подключение к локальной сети – DOS для Windows 7

    Как использовать LINQ для выбора объекта с минимальным или максимальным значением свойства

    Фотографии из папки и отображение полноэкранного слайд-шоу

    Каков правильный способ обработки событий на C ++?

    Давайте будем гением компьютера.