Как переопределить стандартный интерфейс .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 шт):
Вариант решения:
- Перекрыть метод
new - Подавить предупреждение в месте реализации с помощью
#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 в отдном месте, "сломать" что-нибудь в другом.

