static/Shared in VB.NET and C# visibility

.net, accessor, c#, vb.net, visual-studio

Solution

It's not an oversight but your VB code will trigger a warning, which plainly means: do not use this notation.

In VB, static members can be accessed via an instance, since strictly speaking, VB doesn’t have `static`: VB has the keyword `Shared`, meaning that the member is shared between all instances, as opposed to `static` where a member doesn’t belong to any instance.

Now, this is a semantical distinction between those keywords. It just so happens that these two distinct semantics tend to have the exact same effect.

Of course, `static` in C# is today identical to `Shared` in VB.NET but their legacy is different and VB’s `Shared` simply has a different history and therefore historically a different meaning. With this meaning, it makes absolutely sense to access `Shared` members via an instance.

It also makes sense when used together with `Option Strict Off` (loose typing): here, you sometimes don’t know a variable’s type but you still might want to access a `Shared` member. Now, you’ve got no choice but to use an instance to access it:

Option Strict Off
' … '
Dim o As Object = New A()
' Somewhere else, we want to access a static member of A but we don’t know A: '
Dim instance = o.Instance

Problem

I have faced with a situation in VB.NET and C# (.NET2) with the visibility of the static/shared members. It seems to me a little strange in VB.NET: ``` public class A { private static A instance; public static A Instance { get { return instance; } } public string Name { get { } } } ``` usage: `A.Instance.Name` // ONLY Name is "visible" VB.NET: ``` Public Class A Private Shared _instance As A Public Shared ReadOnly Property Instance() As A Get Return _instance End Get End Property Public ReadOnly Property Name() As String Get Return "" End Get End Property End Class ``` usage: ``` A.Instance.Instance.Instance.Instance... ``` // shared member behaves like a class public one I can repeat it to infinite.. is this a Microsoft oversight or a VB.NET "feature"?

Original source