One thing I forgot to mention is that I went to a spendid session (perhaps the best session in the conference) about Future Directions in Language Innovation from Anders Hejlsberg (he is one of them men who brought you C#). When I was watching the database demos at the keynotes I was a bit confused as to how they managed to integrate the database connectivity into the code so directly. Turns out that this is really rather neat. The languuage extensions in C# Version 3.0, plus the generics available in Version 2.0 make it quite simple. The underlying idea seems to be that you only create an explicit, named, class when you really want one. If you are just using an instance of a class for a short time, say as the wrapper for a return from a database query, you just have the system create the class and the type and describe it as of type "var". The word var is strong and magical, it means "make me the thing that actually makes sense in this context". The compiler can figure out what this is and create a class to match. It can then make sure that it is only that type that is used in the correct way, and so you get the benefits of type safety (i.e. you never do something with the wrong kind of thing) without the need to write lots of "plumbing" code. Very clever. I was a bit worried that they were heading towards a system where the type of the variables are established and validated as the program runs (this is deeply scary to a strongly typed chap such as myself) but it is not the case. The compiler can make sure that all the code is type safe (i.e. you've not done anything stupid) before it runs. Which is as it should be.
The thing that did it for me was that to get all this good stuff to work they did not have to change the underlying framework at all. The program binarie run on the same virtual machines, using the same instructions, as previous versions of the langauge, i.e. they did not have to do any low level sleight of hand to make it all work.
Very well thought out, and very well presented. The only problem that I can see is that you might get some rather scary compilation errors along the lines of "the thing I made to hold the result from the query on table 4 does not match up with thing I made to hold the result from the query on table 6". Because non of the classes are actually given names that humans understand, unpicking where you have really gone wrong could be a bit tricky. I'd probably end up trying to give things names, just so that I could figure out what has happened where the fault is.