It is the debate that never ends (though it does change shape): is the current C-style language (C#) infinitely superior to the current most widely used language (VB).
Years ago COBOL and FORTRAN were all the rage. Then this upstart C language showed up claiming to be better. Which was laughable, but the fanatics in the C world wouldn’t give in.
Eventually, seeing that C wasn’t going anywhere, they added ++ to the end and called it C++, claiming that extra non-alphanumeric characters improved the language so now it was better than FORTRAN. (And it was better actually - and no one compared anything to COBOL because that would be just silly - almost as silly as acknowledging that RPG was a programming language at all).
But then the age-old and much maligned BASIC language grabbed headlines by offering a level of productivity for GUI programming (on Windows at least) that no one else could touch. All of a sudden the semi-colon lovers of the world had a new enemy: Visual Basic.
And while C++ was much faster and provided access to the deep, dark, smelly bowels of Windows (16 and then 32 bit), the fact is that it took many times more code to do anything in C++ as compared to VB.
So while the VB devs were at the bar drinking, or at home with their families, the "superior" C++ devs were slaving away trying to find that missing semi-colon or mis-matched close bracket (or worse, that null pointer reference).
That’s why Java was invented: to try and create a version of VB that had semi-colons. Get rid of all the low-level machine issues like null pointers and memory deallocation so programming is more VB-like, yet keep the elegant (cryptic?) syntax of the C-style language family. Unfortunately Sun just didn't get it (and still doesn't...), so Java missed the mark for the GUI developer.
But Microsoft has always understood. They created VB after all. So naturally that’s where C# comes from: VB with semi-colons. As Billy Hollis has said numerous times, the VB community kindly allowed the rest of the world to use the VB runtime. Sure, it was modified to be useful from other languages, but .NET brought to the C-style world what VB had been providing for over a decade: productivity.
(By the way, if you didn’t catch some of the sarcasm and hyperbole in the above you really need to lighten up…)
Two more things to mention:
First there’s the fact that there are more VB developers out there than C# developers. A lot more, pure and simple.
Second, Basic was designed specifically to cater to the way people think. C-style languages were designed specifically to cater to the way machines work. It is incredibly obvious then, that Basic is a better teaching/learning tool, because it is based on cognitive concepts for humans.
(Note that I’m not saying one language is inherently better for actual programming – just for learning).
Either way though, I’ve said it before and I’ll say it again: if you only know one language family you are crippling yourself. If you’ve only ever use Basic (VB or otherwise), or a C-style language you really need to broaden your horizons.
If you can’t stomach learning the "enemy" language (VB or C# depending), then go find another .NET language like FORTRAN, Eiffel, F# or something. For that matter, IL itself is a great choice.
Branch out! Learning other languages only helps you understand and use your preferred language better.
PS. But then there is making money at this business... every argument re: C# vs. VB (favoring C#) ignores the fact there are deadlines in life, and there are more human resources available in with VB skills. Don't forget, most of us are in business, not in school, and don't polish the doorknob so long you forget it's for opening doors.
PPS. Well, for starters, apologists of C# have no previous history before .NET. Where were they? Hardly within Microsoft world...
MS Visual C++ programmers never minded to use VB. Ever. In fact, VB is closer to VC++ than VC# (apart of "semi-coloned" syntax).
For example, both VC++ and VB support exception filters while VC# does not. VB.NET supports advanced OOP concepts in component design while VC# does not go further standard OOP. For example, if you need the client system to use public interfaces but hide their non-public classes implementing such interfaces, your only choice is VB. C# does not allow you to make classes non-public when implementing public interface. Partially you can simulate it via inheritance but this is where polymorphism ends altogether with pure black-box re-use.
Thus, your client component will see everything exposed - public interfaces and public classes.)
VB is even closer to Java than VC# (apart of "semi-coloned" syntax).
VB has its own run-time. Java has its own runtime. While VC# does not.
Have you noticed Microsoft.VisualBasic namespace in .NET environment? That's it. But 99% of C# programmers have no idea they can import this namespace to utilize VB run-time and luxury of optimization...
Another one of a few common things between VB and Java: all methods are virtual by default. Unlike in VC#.
VB enables teams to use intermediate VB developers to implement a solution that only senior VC# programmers can.
Imagine now what senior VB developers can do.
So, why C#?
This is simple. It was a political step in Microsoft's attempts to bring non-Microsoft people into its world. And it was successful.
It was much easier than propagate VB among villains with semi-colons. They would have not accepted anything without a semi-colon in the end of the line.
And they had to be used to work without runtime optimization, as well overloaded operators (such as i++ and i+=1 to give a compiler more work to do).
They had to not know common coding standards. For example, having even come into Microsoft world they should still use "_" (the underscore) to declare variable names. Thus, they had to not mind non-CLS-compliant practices (like the one mentioned).
How many VB guys can you find among C#-exclusivity faith defenders? Barely any... And that's what it is about - "exclusivity", "elite".
VB guys like to drive in luxury.
Well, indeed if you decide to drive semi-colon-hauled tractor, you can consider yourself a part of elite.
Nota Bene. Unthoughtful, sloppy decisions made by certain executives (or senior "technical officers") to use C# instead of VB without serious considerations are strategic mistakes.
In a large project it would mean loss of tens or hundreds of thousand of dollars: for development time, for level of teams required, for learnability, maintenance, support, and extensibility.
We all can guess what companies should do with executives making strategic mistakes, can't we?
One of few reasons to choose C# is to utilize promising non-VB programmers, familiar with system extremely well.
Another one is migration or upgrade of non-Microsoft legacy or aging system to the .NET environment, or enhancing non-.NET legacy systems with new components or modules.
Sometimes it makes sense to mix VB and VC# in the same project for different components. However, due to the fact that C# exposes issues with component design (mentioned above) it can be used for non-component programming tasks, such as UI. But VB makes it also easier again...
We should not forget that we are not there to create new elegant programmatic passages, not to improve Computer Science, not to practice our own creativity. We are there to serve businesses and save them money.
Exploiting customers' illiteracy in programming and handle them only the product you favor to work with is unprofessional and should be mercilessly obstructed.