2017-06-26 3 views
3

Ich versuche IEquatable<T> für eine bestimmte Klasse in F # zu implementieren. In diesem Fall erhalte ich jedoch einen unerwarteten Fehler.Warum wird diese Schnittstellenimplementierung in F # nicht kompiliert?

Ich habe den folgenden Code:

type Foo private (name : string) = 

member this.Name = name 

member this.Equals (other : Foo) = this.Name = other.Name 

override this.Equals other = 
    match other with | :? Foo as foo -> this.Equals foo | _ -> false 

override this.GetHashCode() = this.Name.GetHashCode() 

interface IEquatable<Foo> with 
    this.Equals other = this.Equals other 

Diese nicht kompiliert. Ich erhalte den folgenden Fehler: "Unerwartetes Schlüsselwort" mit "in der Mitgliedsdefinition". Außerdem erhalte ich eine "mögliche falsche Einrückung ..." Warnung. Ich bin nicht sicher, was das Problem ist, weil es mir scheint, dass das oben wird, wie in F # implementiert allgemein Schnittstellen. Warum kompilieren die oben nicht?

Antwort

6

Nun, ich kann die Frage selbst beantworten. ich nicht Mitglied vor der Umsetzung gelegt hat. mit

this.Equals other = this.Equals other 

Austausch

member this.Equals other = this.Equals other 

macht alles in Ordnung.Die Tatsache, dass der Compiler skizziert "mit" Stichwort als das Problem mich abwarf.

+1

In späteren Versionen von F # wurden einige Verbesserungen vorgenommen, um die Fehlerberichterstattung zu verbessern. Das scheint ein guter Kandidat zu sein. Vielleicht poste dies als ein Thema auf: github.com/microsoft/visualfsharp/issues? – FuleSnabel

Verwandte Themen