C# has got a bunch of neat functional stuff in it (Microsoft's researchers have seen the glory of functional languages), but Java might be easier to start off with.
Once you can get through Java, everything else you learn will feel immensely superior...
I'll bite again. What makes C# so difficult to start with? I seriously want to know what obstacles are out there for people interested in starting with C#.
C# by itself isn't terribly difficult, other than its constantly balooning specification. A lot of the percieved difficulty with C# today comes from the rapid shifts in direction from Microsoft in terms of the "Microsoft Way" of using it. A prime example is the DLinq / Linq to SQL / ADO.Net Entities fiasco that's occurred in the past 5 or 6 months; Microsoft is trying to react quickly, but in doing so is crossing its own streams.
Of course, these are all really .Net problems, but more often than not, C# and .Net are used interchangeably.
You're exactly right, those are .NET problems not specific to a language, and not really problems for a hacker. There are multiple open source ORMs that take full advantage of the language features (like LINQ) and aren't subject to MS's whims.
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.
I don't think the time-line has as much to do with it as the scope of the changes do. Again, this is personal opinion; and I'm speaking from the angle of someone who has spent many years doing consulting work on the Microsoft stack, and having to deal with figuring out which ways the 9-to-5'ers are going to break things next.
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.
This is one area where I think MS gets a bad rap. If they didn't keep adding new stuff, everyone would complain that they were stagnant and falling behind the times. So they add popular new features to C# like lambdas and such, and now they're bloated.
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#.
Not going to argue either way (I do like both Java and C#, choosing one over the other depending on what I want/need to do)... but don't you think most enterprise languages mature over time too?
Once you can get through Java, everything else you learn will feel immensely superior...