Причина, по которой вы получаете такую ошибку
Я не знаю, почему F#
не позволяет мне писать такие коды, как C#
.
public class MyType
{
public int Value {get;set;}
public static bool operator >(MyType left, int right)
{
return left.Value > right;
}
public static bool operator <(MyType left, int right)
{
return left.Value < right;
}
}
Дажеесли этот тип не реализует интерфейс IComparable
, я мог бы сравнить его с int
, как показано ниже:
t > 2
t < 6
Кажется, что F#
трактует (>)
как T' -> T' -> bool
:
val ( > ):
x: 'T (requires comparison )->
y: 'T (requires comparison )
-> bool
Это означает:
- Левый и правый параметры имеют одинаковый тип.
T'
требует сравнения (IComparable
)
Если я правильно понимаю, это причина, по которой вы получаете сообщение об ошибке:
Ожидается, что это выражение будет иметь тип «MyType», но здесь имеет тип «int'
Даже если вы реализовали интерфейс IComparable
, стандарт (>)
требует, чтобы левый и правый параметры принадлежали к одному и тому же типу.
A Walkaround
Обходной путь - создать пользовательскую функцию (>)
, которая принимает параметры MyType
влево и * int
справа:
type MyType(info) =
member x.Info : int = info
<strike>
let inline (>) (left: MyType) (right: int) =
left.Info > right
let inline (<) (left: MyType) (right: int) =
left.Info < right
</strike>
// see https://stackoverflow.com/questions/19682432/global-operator-overloading-in-f
let inline (>) (left) (right) =
match (box left, box right) with
| (:? MyType as l, :? int as r ) ->
l.Info > int right
| (:? IComparable as left', :? IComparable )->
let r = left'.CompareTo right
r > 0
| _ -> failwith "not support type "
let inline (<) (left) (right) =
match (box left, box right) with
| (:? MyType as l, :? int as r ) ->
l.Info < int right
| (:? IComparable as left', :? IComparable )->
let r = left'.CompareTo right
r < 0
| _ -> failwith "not support type "