Как проверить реализацию интерфейса в F # - PullRequest
0 голосов
/ 19 февраля 2019

Предполагая, что у меня есть эти типы (простите синтаксис C #, я новичок в F #):

interface I { }
class A { }
class B : A, I { }

В C # я могу сделать это:

A a = …
bool isI = a is I;

Однако вF #, имеющий это:

let a : A = ...

Я знаю, что a может содержать экземпляр B и реализовывать I.Однако это приводит к ошибке компиляции, говоря, что A не совместим с I:

let isI = a :? I

Однако это работает:

let isI = a :> obj :? I

Почему?a :? I не является ни повышением, ни снижением, конечно.Но как это работает с obj?Интерфейсы как-то считаются подклассами объектов?

1 Ответ

0 голосов
/ 19 февраля 2019

Я думаю, что ответ подсказан в документах :

Возвращает true, если значение соответствует указанному типу (в том числе, если это подтип);в противном случае возвращает false (оператор проверки типа).

Если вы ссылаетесь на спецификацию в 7.9 динамических шаблонах проверки типа , это подтверждает этоявляется ограничением времени компиляции:

Ошибка возникает, если type не может быть определен статически как подтип типа ввода шаблона

Интерфейс «выше» в иерархии, он не A или подтип A.

В mucn таким же образом это не компилируется:

let isObj = a :? obj

Первым обновлением до obj вы можете проверить, является ли тип I, так как это подтип obj.

...