You can try to use generics to prevent operations between different "vector" classes something like following concept code:
class Vector<Traits> : IEnumerable<double>
{
public static Vector<Traits>
operator + (Vector<Traits> left, Vector<Traits> right) { ... }
}
var v1 = new Vector<MyTraitsOne>(2);
var v2 = new Vector<MyTraitsOther>(2);
var r = v1 + v2; // should fail.
(Traits
class as generic's parameter in sample is solely to distinguish different vectors of double
, but in real case there may even be good usage of such class)