C# vs. VB.Net – Understanding Namespace References

c++usingusing-directivesvb.net

In VB.Net you can do something like the following without any issues… just ignore the fact that this is a pretty useless class 🙂


Imports System

Public Class Class1
    Public Shared Function ArrayToList(ByVal _array() As String) As Collections.Generic.List(Of String)
        Return New Collections.Generic.List(Of String)(_array)
    End Function
End Class

However if you do the same thing in C#…


using System;

public class Class1
{
    public static Collections.Generic.List ArrayToList(string[] _array)
    {
        return new Collections.Generic.List(_array);
    }
}

You will get an error on the line with the return on "Collections.Generic.List" saying "The type or namespace name 'Collections' could not be found (are you missing a using directive or an assembly reference?)"

I know that you have to actually have a using directive to System.Collections.Generic to use List but I don't know why. I also don't understand why I don't get the same error in the function declaration, but only in the return statement.

I was hoping someone can explain this or even refer me to a technet page that explains it. I have searched around, but can't find anything that explains this concept.

Edit: Just to note, the question is really about the referencing of a sub-namespace such as in the example being able to reference Collections within System.

Best Answer

using directive in C# does not allow this:

Create a using directive to use the types in a namespace without having to specify the namespace. A using directive does not give you access to any namespaces that are nested in the namespace you specify.

VB.NET, however, supports somewhat closer behavior with Imports statement:

The scope of the elements made available by an Imports statement depends on how specific you are when using the Imports statement. For example, if only a namespace is specified, all uniquely named members of that namespace, and members of modules within that namespace, are available without qualification. If both a namespace and the name of an element of that namespace are specified, only the members of that element are available without qualification.

Reference SO Question

Related Question