On Friday, 5 October 2012 at 12:24:12 UTC, Paulo Pinto wrote:
On Friday, 5 October 2012 at 12:01:30 UTC, Piotr Szturmaj wrote:
Java and C# with their generics can do the following:
class List { }
class List<T> { }
List list = new List();
List<int> intList = new List<int>();
In D similar code can't work because we can't have both a type
and a template with the same name. So this code must be
rewritten to:
...
Why to you need this?
Java and C# only allow this type of code due to backwards
compatibility, because their first version did not allow for
generics, and their creators did not want to force everyone to
recode their code bases.
The Java and C# situations are very different. In Java, generics
are "erased" at runtime so a List<int> is the same thing as a
List. In C#/.NET, however, List<int> and List are 'unrelated'
types, which is what Piotr was talking about.
.NET allows "overloading" types based on the number of generic
parameters, so for example Tuple<X> is a different type than
Tuple<X,Y> (the runtime names are Tuple`1 and Tuple`2). Since C#
has no "default arguments" for generics or "tuple template
parameters", it is trivial to allow different types that have the
same name but a different number of generic parameters. In D,
however, the situation is a bit more complicated.