2014-10-10 3 views
7

Betrachten Sie diese Schnittstelle:Warum ist `unit' anders durch die F # Typ-System behandelt, wenn sie als generische Schnittstelle Argument verwendet?

type A<'a> = 
    abstract X : 'a 

Versuchen wir es als generisches Argument mit int zu implementieren:

{ new A<int> with member this.X = 5 } // all is well 

nun die unit für ein Argument versuchen lassen:

// Compiler error: The member 'get_X : unit -> unit' does not have the correct type to override the corresponding abstract method. 
{ new A<unit> with member this.X =() } 

Jetzt, wenn wir eine nicht-generische Schnittstelle zu definieren, alles funktioniert auch gut:

type A_int = 
    abstract X : int 

{ new A_int with member this.X = 5 } // works 

type A_unit = 
    abstract X : unit 

{ new A_unit with member this.X =() } // works as well! 

Gibt es etwas, das ich dieses Problem beheben kann?

+0

In C# ist es nicht möglich, eine generische Funktion Rückkehr 'void' hat - siehe zum Beispiel https://programmers.stackexchange.com/questions/131036/why-is-void-not-allowed-as-a- generischer Typ-in-c. Es ist möglich, dass in diesem Fall ähnliche Einschränkungen für den F # -Code gelten. –

Antwort

5

In F # wird ein abstrakter Slot mit dem deklarierten Rückgabetyp unit in .NET IL als Rückgabetyp von void kompiliert. Im Gegensatz dazu wird ein abstrakter Schlitz mit deklarierten Rückgabetyp „T“ in .NET IL kompiliert als Gattungsrückgabetyp „T“, das, wenn T von unit werden unit' instanziiert wird.

Siehe: F# interface inheritance failure due to unit

0

Ihr generisches Element X ein Wert von jeder Art sein kann. "Einheit" in F # ist nicht wirklich ein Typ (oder ist ein ganz besonderer Typ, wenn Sie es wünschen) - es ist eine Abwesenheit von irgendeinem Wert.