При запуске программы вываливается исключение в следующей строчке кода:
Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Background, (SendOrPostCallback)delegate {
this.xFilesList.SetValue(ListView.ItemsSourceProperty, _filesCollection);
}, null);
System.InvalidOperationException: ‘Failed to compare two elements in the array.’
Inner exception
ArgumentException: At least one object must implement IComparable.
Inner exception
ArgumentException: At least one object must implement IComparable.
В логе дебаггера такое сообщение:
Exception thrown: ‘System.InvalidOperationException’ in System.Private.CoreLib.dll
An exception of type ‘System.InvalidOperationException’ occurred in System.Private.CoreLib.dll but was not handled in user code
Failed to compare two elements in the array.
Коллекция, на которую ссылается ошибка, представлена так:
public ObservableCollection<DetailedFile> _filesCollection;
При этом сам класс DetailedFile содержит такое поле:
public FirewallRule? FWRule { get; set; } // FW direction, protocol and ports
В программе именно по нему происходила сортировка. Т.к. там не был реализован интерфейс сравнения, выбрасывалось исключение.
Чтобы устранить ошибку, нужно было наследовать этот класс от IComparable, при этом необходимо было добавить метод сравнения:
public int CompareTo(object? obj)
{
if (obj == null)
{
return 1;
}
FirewallRule otherRule = obj as FirewallRule;
if (otherRule != null)
return this.ToString().CompareTo(otherRule.ToString());
else
throw new ArgumentException("Object is not a FirewallRule");
}
Информация, которая выводилась этим классом, была немного сложного типа (например, ||▶ TCP:80,443),так что пришлось перегружать метод ToString(), чтобы отображать нужную информацию. По этой строке и происходила сортировка (и соответственно сравнение).