Мне нужно сравнить объекты разных типов, которые, как я знаю, имеют свойства Id и Legacy_id. К сожалению, я не могу добавить к ним интерфейс, поскольку типы берутся из схемы базы данных. Я надеялся, что следующий компаратор будет работать:Почему тип ввода не определяет автоматически, что свойство существует по типу?
type Comparer<'T >()=
interface System.Collections.Generic.IEqualityComparer<'T> with
member this.Equals (o1:'T,o2:'T)=
o1.Legacy_id=o2.Legacy_id
member this.GetHashCode(o:'T)=
o.Id+o.Legacy_id
Также у меня есть экземпляры типа сравнения с типами. Итак, теоретически компилятор имеет достаточно информации.
Но это дает ошибку: «Поиск объекта неопределенного типа на основе информации до этой точки программы. Аннотации типа могут потребоваться до этой точки программы, чтобы ограничить тип объекта. Это может позволить поиск для решения ».
Интересно, почему здесь F # не работает? Существуют ли какие-либо реальные/теоретические ограничения или они просто не реализованы? Такой вывод может быть очень полезным.
Я подозреваю, что объяснение о компиляторе F # только вперед. Ограничения C# не имеют. Об этом жалуется сообщение об ошибке. Это так?
Это не может быть скомпилировано, потому что у любого заданного '' T' не гарантируется наличие свойства с именем 'Id'. Вот мысленный эксперимент: что произойдет, если вы создадите этот класс как «Comparer'? –
@FyodorSoikin Но я не копирую его как Comparer. Поэтому, пока я не создам экземпляр с правильными типами, компиляция может работать. –
alehro
По-прежнему пытайтесь представить: что, по-вашему, должно произойти, если вы попробуете 'int'? –