Until now, I didn’t realize how twisted is the history of design of such little feature. In C++ you can access static elements from an instance or a type:
my_obj.InstanceField; my_obj.StaticField; MyType::StaticField;
Not bad, but of course Java guys had to simplify things:
my_obj.InstanceField; my_obj.StaticField; MyType.StaticField;
C# designers noticed there are too many dots here, and there is too little difference between the first two calls so… they removed external access to type element from an instance. The only options available are:
And this is the worst choice you could make, because sometimes all you have is an instance (object) and you have to jump through some hoops just to get the type of instance.
Skila brings sanity back:
my_obj.InstanceField; my_obj::StaticField; MyType.StaticField;
Such syntax is consistent with accessing namespace elements (Skila borrows it from C#, not C++) and it also improves readability — when you access an element via an instance by looking at next symbol (dot vs. colon) you can say whether it is a type or an instance element. One can think of a dot as the same level access (type to type, instance to instance) while double colon serves as cross level access (instance to type).