Как переопределить стандартный интерфейс .NET-6?

Стандартный метод int IComparable.CompareTo(T? other) допускает значение NULL.

Мне же нужно, для типов реализующих IItem, исключить проверку (T is not null), так как кастомный CompareTo([DisallowNull]) всегда принимает НЕнулевой аргумент.

Но компилятор выдает предупреждение о неверной реализации и подсвечивает ошибку:

введите сюда описание изображения

interface IItem : IComparable<IItem> {
  // Пробовал так, но это тоже не помогает :(
  // public new int CompareTo(IItem other);
}

class Item : IItem {
  // Ошибка csharp(CS8767) ... не соответствует неявно реализованному 
  //  элементу "int IComparable<IItem>.CompareTo(IItem? other)
  public int CompareTo(IItem other) {
    throw new NotImplementedException();
  }
}

Как перекрыть этот метод в interface IItem /* ... */ и избавиться от предупреждений?

UPDATE:

Проблема заключается в отображении этой ошибки не только при компиляции, но и в окне "ПРОБЛЕМЫ", что очень мешает.

Вариант с "правильной" реализацией CompareTo(?)

interface IItem : IComparable<IItem> {
  public int Id { get; set; }
}

class Item : IItem {
  public int Id { get; set; }
  public int CompareTo(IItem? /* <- "?" надо удалить знак вопроса */ other) =>
    // ... и избавиться от этой строки (other is not null)
    (other is not null)
      ? Id.CompareTo(other.Id) // <- оставить только это
      : 1;
}

class Foo {
  public static void Test(IItem? foo) {
    IItem item = new Item { Id = 1 };
    IItem? itemNull = null;
    var _ = item.CompareTo(itemNull);
    //        Вот здесь -> ^^^^^^^^ <- никогда не будет NULL и мне нужно отобразить ошибку
  }
}

Ответы (1 шт):

Автор решения: Alexander Lonberg

Вариант решения:

  1. Перекрыть метод new
  2. Подавить предупреждение в месте реализации с помощью #pragma
interface IItem : IComparable<IItem> {
  public int Id { get; set; }
  // 1 Перекрываю метод
  public new int CompareTo(IItem other);
}

class Item : IItem {
  public int Id { get; set; }

  // 2 Подавляю ошибку реализации
#pragma warning disable 8767
  public int CompareTo(IItem other) => Id.CompareTo(other.Id);
#pragma warning restore 8767
}

class Foo {
  public static void Test(IItem? foo) {
    IItem item = new Item { Id = 1 };
    IItem? itemNull = null;
    // 3 Теперь NULL указывает на ошибку - как это было задумано
    _ = item.CompareTo(itemNull);
    // csharp(CS8604)  ^^^^^^^^
  }
}

Это решает вопрос с переопределением стандартного CompareTo(?), допускающего NULL.

введите сюда описание изображения

Но ... - Проблема в том, что везде придется указывать #pragma, хотелось бы этого избежать. Кроме того, я не знаю, может ли применение #pragma в отдном месте, "сломать" что-нибудь в другом.

→ Ссылка