2012-04-04 5 views
2

Я в основном спрашивают, почему следующие строки кодов не компилировать:Использование блока в качестве параметра типа и верховные методы

type IGenericType<'a> = 
    abstract member MyFunc : 'a -> 'a -> 'a 

type Implementer() = 
    member x.Test()() =() // unit->unit->unit 
    interface IGenericType<unit> with 
     member x.MyFunc a b = b // FS0017 
     // member x.MyFunc()() =() // FS0017 

Просто интересно, если есть способ, чтобы сделать эту работу, как предполагалось. Я предполагаю, что это ограничение, связанное с реализацией подразделения и дженериков.

Im используя следующий обходной путь на данный момент:

type Nothing = 
    | Nothing 
type Implementer() = 
    interface IGenericType<Nothing> with 
     member x.MyFunc a b = b 

Надежда кто-то может принести некоторый свет на эту проблему.

ответ

2

Вы догадались, что это правильно. Для интероперабельности внутри .NET framework компилятор F # не испускает IL для unit, а вместо этого заменяет его на void.

Таким образом, ваш общий интерфейс работает на любом типе, но unit. Это не кажется большой проблемой; ваше обходное решение - хорошее решение для этой проблемы.

Более подробное обсуждение можно найти в F# interface inheritance failure due to unit.