Ma question est un peu liée à celui-ci - Functions with generic parameter types - mais je ne peux pas tout à fait savoir comment faire ce que je veux.F #: fonctions de surcharge
Je veux définir un « descendants fonction pour envelopper l'appel à 'descendants' sur les différentes classes C# comme ceci:
let nom des descendants (XDocument: XDocument) = xDocument.Descendants nommer
nous descendants name (xElement: XElement) = xElement.Descendants name
Cette approche ne fonctionne pas car nous avons une définition en double de 'descendants'.
je pensais qu'il serait possible d'utiliser la fonction en ligne et résoudre statiquement les paramètres pour définir la méthode suivante pour le faire à la place:
let inline descendants name (xml : ^x when ^x : (member Descendants : XName -> seq<XElement>)) =
xml.Descendants name
Mais je suis obtenir cette erreur en essayant de le faire :
Recherche sur un objet de type indéterminé sur la base des informations antérieures à ce point de programme. Une annotation de type peut être nécessaire avant ce point de programme pour contraindre le type de l'objet. Cela peut permettre à la recherche d'être résolue.
Existe-t-il un moyen que je peux écrire cette deuxième fonction pour faire ce que je veux?
Ah je ne me suis pas rendu compte que la surcharge ne fonctionnait que pour les membres, évidemment n'a pas lu l'autre poste assez étroitement! Je n'ai pas non plus remarqué qu'ils héritaient tous deux de XContainer donc merci, c'est une bien meilleure solution. –
J'ai essayé la surcharge normale et le compilateur dit qu'il y a 2 membres appelés 'Descendants' avec le même nombre d'arguments –
versions, F # compilateur requis '[]' à utiliser lors de la surcharge, mais je ne suis pas sûr de la version qui a été supprimée ... J'ai simplement essayé un exemple plus simple dans F # RC (deux méthodes , à la fois avec deux arguments) et cela a bien fonctionné (sans 'OverloadID'). –