What are the reasons for resolving overloaded operators statically? It seems a strange choice to me – the only advantage I can think of is a small performance gain (but then the JIT may avoid that sometimes as well) at the cost of some rather unintuitive behavior – i.e. I basically have to forward the operator to a virtual function to get the wanted behavior.
Was this just taken over from C++ or are there some other good reasons for this?
See Eric Lipperts article Why are overloaded operators always static in C#?
It is be possible to support instance based operators but the C# language designer did not see the big gain compared to the efforts needed to make it work correctly.