2009-09-22 6 views
1

J'ai une classe appelée Vector qui implémente un certain nombre d'opérateurs tels que + et des propriétés telles que Count. Le vecteur est également sous-typé par des classes telles que DenseVector, SparseVector qui hérite de Vector. Maintenant, en F # quand j'ÉCRIREF # Résolution d'opérateur

let foo (v : #Vector) (w : #Vector) = v + w 
let bar (v : #Vector) (w : #Vector) = v.Count + w.Count 

Pour « foo » je reçois l'avertissement. « Cette construction provoque code moins générique que celle indiquée par ses annotations de type La variable de type implicite par l'utilisation d'un '#', '_' ou toute autre annotation de type à ou près de ... a été contraint à être de type 'Vector'. " alors que "bar" fonctionne très bien.

Je ne comprends pas pourquoi la contrainte de type flexible fonctionne bien pour les propriétés, mais pour la résolution de l'opérateur, elle rencontre des problèmes. Des explications/idées/solutions de contournement?

EDIT Ma classe Vector est abstraite et a un opérateur avec la signature suivante:

public static Vector operator +(Vector leftSide, Vector rightSide) 
+0

Ceci est _unary_ '+'. Non 'leftSide'? –

+0

désolé, j'ai copié et collé le mauvais opérateur – Jurgen

Répondre

2

Je pense que la raison est assez simple: il ne fonctionne pas pour les opérateurs, car ils ne sont pas hérités. Pour une solution de contournement, cela devrait fonctionner:

let foo (v : #Vector) (w : #Vector) = (v :> Vector) + (w :> Vector) 

Cependant, je ne suis pas sûr que ce soit vraiment ce dont vous avez besoin. Vector est-il une classe abstraite? Comment est + mis en œuvre?

+0

J'ai cherché une explication sur les sous-types ne pas hériter des opérateurs; avez-vous un indice à ce fait? – Jurgen

+4

Les opérateurs sont définis dans .NET comme des méthodes statiques, essentiellement; et les membres statiques ne sont jamais hérités dans .NET. –