2009-09-22 4 views
1

У меня есть класс под названием Вектор, который реализует ряд операторов, таких как + и такие свойства, как Count. Вектор также подтипирован такими классами, как DenseVector, SparseVector, которые наследуются от Vector. В настоящее время в F #, когда я пишу следующееF # Разрешение оператора

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

Для «Foo» Я получаю предупреждение:. «Эта конструкция вызывает код менее общие, чем указано в его аннотации типа переменного типа подразумевается использование '#', '_' или аннотация другого типа в или около ... была ограничена, чтобы быть типом 'Вектор'. " пока «бар» работает просто отлично.

Я не понимаю, почему гибкое ограничение типа отлично работает для свойств, но для разрешения оператора у него возникают проблемы. Любые объяснения/идеи/обходные пути?

EDIT Мой Вектор класс является абстрактным и имеет оператор со следующей подписью:

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

Это _unary_ '+'. Нет 'leftSide'? –

+0

Извините, я скопировал и вставил неправильный оператор – Jurgen

ответ

2

Я думаю, что причина довольно проста: она не работает для операторов, потому что они не наследуются. Для обходного пути это должно работать:

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

Однако я не уверен, что это действительно то, что вам нужно. Является ли вектор абстрактным классом? Как реализовано +?

+0

Я искал объяснения относительно подтипов, не наследующих операторов; у вас есть указатель на этот факт? – Jurgen

+4

Операторы определены в .NET как статические методы, в основном; и статические члены никогда не унаследованы в .NET. –

Смежные вопросы