Where C# fails, VB delivers

Recently I've came across a strange behavior that took me some thinking to work around.

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.

Comments