(I've been thinking of cross-language contracts recently. Maybe they can help.)
As I have previously stated, I do not view .NET to be as language-neutral as its designers repeatedly claim. All the .NET languages I have seen so far are basically C# with a different syntax. Anything that attempts to break this mold, e.g. unmanaged C++, is incompatible with the cross-language inheritance feature.
So to me basically this becomes a question of using inheritance as an OS API. While there are advantages to this technique, as demonstrated in ASP.NET for example, I find it significantly limited by the CLR痴 lack of support for multiple inheritance.
To put it more bluntly, the use of inheritance as a means to access system services has forced Microsoft to drastically change the behavior of some programming languages on .NET. For example, a quote from an article about JScript.NET:
The other major performance improvement added to JScript .NET is the introduction of Option Fast. This option tells the compiler to enforce certain rules that allow additionally optimizations, at the cost of some reduced functionality. When Option Fast is enabled, the following JScript behavior is activated:
- You must declare all variables.
- You cannot assign values to, or redefine, functions.
- You cannot assign to, or delete, predefined properties of the built-in JScript objects.
- You cannot add expando properties to the built-in objects.
- You must supply the correct number of arguments to function calls.
- The arguments property is not available within function calls.
It is quit obvious that with this option enabled you are not in JavaScript-land anymore. Add to that the inclusion of classes and interfaces, which you must use to access .NET functionality (a template-based JavaScript object cannot extend a system class.) It'll be interesting so see how Scheme.NET and Haskell.NET come out (if they ever do come out.)