Перепишите некоторый общий код C# в F#
Я пытаюсь переписать общий код вот так (C#):
U Upcast<T, U>(T x) where T : U { return x; }
В F#:
let ucast<'T, 'U when 'T :> 'U> (x: 'T) = x :> 'U
Но решение ограничений F# работает иначе, чем C#, и компилятор выдает кучу типографских ошибок:
Ошибка FS0698: недопустимое ограничение: тип, используемый для ограничения: запечатано, что означает ограничение может быть удовлетворен только в самый один решение
Предупреждение FS0064: эта конструкция вызывает код должен быть менее общим, чем указано по типу аннотации. Тип переменная ' T была ограничена быть типа "у'.
Ошибка FS0663: Этот параметр типа имеет был использован таким образом, что ограничивает его чтобы всегда быть " U '
Ошибка FS0013: статическое принуждение от типа 'У 'у
включает неопределенный тип на основе Об информации, предшествующей этой программе точка. Статического давления не допускается на некоторых типах. Далее тип нужны аннотации.Ошибка FS0661: один или несколько явный тип класса или функции переменные для этой привязки не могли будьте обобщенными, потому что они были ограничен другими типами
Пожалуйста, объясните мне, как правильно переписать код C# выше и почему версия F#, которую я написал, не компилируется.
3 ответа:
Это невозможно в F#. Смотрите Как перевести ограничение параметра универсального типа` where T : U ' из C# В F#? и http://cs.hubfs.net/forums/thread/10534.aspx .
Для этого нельзя написать типобезопасную функцию. Вы могли бы, однако, использовать
upcast
оператор вместо вашей функции.