"The least painful" is what I would say.
Of course, these are all really .Net problems, but more often than not, C# and .Net are used interchangeably.
I think that "constantly balooning specification" is an overstatement. Look at the release timeline:
- 2002: Version 1 (with VS.net 2002)
- October 2005: Version 2 (with VS2005)
- November 2007: Version 3 (with VS2008)
- Oct/Nov 2009 (I'm guessing): Version 4 (with VS2010)
Four versions over that span is hardly "constantly balooning". The .NET framework revs slightly more often with SPs, but major versions are on about the same pace.Version 1.0 of the C# specification clocks in at 405 pages. There was an addendum in 1.2 that I'll leave out, because it was a respecification of 1.0.
2.0 came along and added 117 pages of specification - including generics, partial classes, iterators, and a handful of other things. On pure specification, that's a growth of 25% to the core language. (I know this isn't really scientific, but I think you get my drift).
Then in 3.0, just 2 years later, the spec is back to over 500 pages (just for the language!). This version added a bunch of functional paradigm stuff to the language, lambdas, linq and the like.
And now in 4.0, they're talking about making C# essentially a dynamic language.
Now, all this being said, I really do like C#; but I think that it behooves everyone who likes C# to admit that it's a large and evolving language; the paradigms that Microsoft keeps adding to the language don't really seem to fit from one version to the next.
4.0 will not essentially be a dynamic language. They're making it much easier to interop with dynamic languages by adding some dynamic constructs, but it's still as statically typed as ever. 'dynamic' is a shortcut to save you time, not re-invent how you work with C#.
Java seems to be no exception: http://en.wikipedia.org/wiki/Java_version_history