Ist es möglich, die IDbSetT-Schnittstelle in F # zu implementieren?

8

Ich versuche eine Pseudo-Implementierung von IDbSet<T> , und ich mache es in F #.

%Vor%

Alles ist gut, außer für diese Zeile:

%Vor%

... was mir diese Compilerfehler gibt:

  

Fehler FS0698: Ungültige Bedingung: Der für die Bedingung verwendete Typ ist   versiegelt, was bedeutet, dass der Zwang nur maximal befriedigt werden konnte   eine Lösung

     

Warnung FS0064: Dieses Konstrukt verursacht weniger Code   generisch als durch die Typ Anmerkungen angegeben. Die Typvariable 'TD   wurde auf Typ '' T 'beschränkt.

     

Fehler FS0663: Dieser Typ   Parameter wurde in einer Weise verwendet, die es einschränkt, immer "T" zu sein   wenn 'T: not struct'

     

Fehler FS0661: Eine oder mehrere der expliziten Klasse   oder Funktionstypvariablen für diese Bindung konnten nicht verallgemeinert werden,   weil sie auf andere Typen beschränkt waren

Diese Zeile versucht, diese Methode , die laut dieser Seite die folgende Signatur in C # hat:

%Vor%

Und diese Unterschrift in F #:

%Vor%

Wenn ich versuche, die Beispiel-F # -Signatur zu verwenden, erhalte ich eine Reihe von Syntaxfehlern, was mich nicht überrascht, da diese Signatur nicht einmal wie gültiges F # aussieht.

Ich bin nicht wirklich sicher, was ich von diesen Fehlermeldungen halten soll, oder wie ich meine Einschränkungen schreibe, um sowohl die Schnittstelle als auch den F # -Compiler zu erfüllen. Ich frage mich, ob es überhaupt möglich ist, diese spezielle Microsoft-Schnittstelle in dieser speziellen Microsoft-Programmiersprache zu implementieren. Irgendwelche Vorschläge wären willkommen.

    
Joel Mueller 14.05.2014, 00:58
quelle

2 Antworten

7

Die Methode Create benötigt eine Subtype-Einschränkung zwischen zwei generischen Typparametern. Ich fürchte, es gibt keine Möglichkeit, einem generischen Typparameter basierend auf einem anderen in F # eine Subtype-Einschränkung hinzuzufügen. Sie werden immer als gleich angenommen. Weitere Informationen finden Sie in der Spezifikation Neue Einschränkungen des Formulartyps: & gt; 'b sind wieder gelöst als type =' b.

Siehe diese Antwort für ein ähnliches Problem.

Wir sollten darum bitten, dieses Feature in die nächste F # -Version aufzunehmen.

    
Gustavo 14.05.2014, 06:15
quelle
1

Ich war anfangs sehr enttäuscht. Ich bin immer noch in irgendeiner Weise, aber es gibt einen Workaround in EF6. Sie können DbSet<'TEntity> direkt erben und Überschreibungen verwenden, um die Auflistung im Speicher zu implementieren. Dies wird für die meisten Fälle ausreichen; Sie können von diesem Typ erben, wenn Sie eine konkrete Implementierung von Find wollen.

%Vor%     
Rob Lyndon 13.08.2016 21:48
quelle

Tags und Links