Where C# fails, VB delivers.
As you may know, my language of choice has been VB for as long as I can remember. However, I, like any good developer, can work just as good in C#. Really, it's no biggie.
Anyway, what I'm talking about here is dynamic type resolution.
For instance let's say we have the following VB program:
Module Program Sub Main() Dim value As Object = 123 Format(123) Format(value) End Sub Sub Format(ByVal value As IFormattable) Console.WriteLine(value.ToString(Nothing, Nothing)) End Sub End Module
When ran, the above program will generate the following output:
123 123
Easy enough, huh?
Now, if we port this program to C# like this:
class Program { static void Main(string[] args) { object value = 123; Format(123); Format(value); } static void Format(IFormattable value) { Console.WriteLine(value.ToString(null, null)); } }
Which is the literal translation of the VB program above, we can't even compile to program, because the C# compiler gives the following errors:
error CS1502: The best overloaded method match for 'DynamicCS.Formatter.Format(System.IFormattable)' has some invalid arguments
error CS1503: Argument '1': cannot convert from 'object' to 'System.IFormattable'
It's the same damn code, how come C# can't convert from object to IFormattable?
Well, the answer is that the C# compiler requires that all types to be known at compile time, rater than establish at runtime.