Странным показалось поведение F#. В небольшом проекте решил попробовать реализовать алгоритмы на F#. Сущности были описаны code first entity framework. Одна из сущностей, а именно Вершина графа, должна была послужить ключем в структуре map в коде F#. Для этого вершине нужно было дописать методы:
public int CompareTo(Vertex that)
{
return this.ID.CompareTo(that.ID);
}
public int CompareTo(object other)
{
return 0;
}
Потом оказалось, что если переводишь последовательность вершин в map
verteces |> Seq.map(fun r -> r,-1.0) |> Map.ofSeq
, вызываются не первые методы, а вторые. Приходится править код:
public int CompareTo(Vertex that)
{
return this.ID.CompareTo(that.ID);
}
public int CompareTo(object other)
{
if (other is Vertex)
return this.ID.CompareTo((other as Vertex).ID);
else
return 0;
}
Ничего страшного, просто меня это удивило.
Почему не вызывается изначально первый метод?!
Здравствуйте, hyp1k, Вы писали:
H>Ничего страшного, просто меня это удивило. Почему не вызывается изначально первый метод?!
1) Вы не дописали IComparable<Vertex> в заголовке своего класса.
2) Map не использует обобщенную версию интерфейса, а ограничивается только IComparable.
Здравствуйте, hyp1k, Вы писали:
H>Писал так
H>public class Vertex : BaseEntity, IComparable<Vertex>, IComparable
Строго говоря, реализация CompareTo у вас не совсем верная, нужно уметь обрабатывать null значения, ну и код задублирован.
public int CompareTo(Vertex that)
{
return (that != null) ? this.ID.CompareTo(that.ID) : 1;
}
public int CompareTo(object other)
{
if (other == null)
return 1;
if (other is Verter)
return CompareTo((Vertex) other)
else
throw new ArgumentException("other is not a Vertex");
}