RE: Generics in .NET 2.0 SUCK

From: Beeeeeeeeeeeeves (Beeeeeeeeeeeeves_at_discussions.microsoft.com)
Date: 07/27/04


Date: Tue, 27 Jul 2004 10:05:40 -0700

The reason Generics in .NET 2.0 SUCK ?
Likely because they are a complete crib off templates in C++, which ALSO SUCK!!!
They are the most POOR idea for a way of programming I have ever seen.

"Ruediger Klaehn" wrote:

> Sorry about the harsh language, but I have to vent my anger to somebody who
> actually understands what I am talking about. Complaining to my girlfriend
> is not going to produce any meaningful results other than straining our
> relationship...
>
> I just downloaded Visual C# Express Edition to mess with .NET 2.0 generics.
> Being a numerically inclined developer, the first thing I wanted to write
> was a generic complex number class. I also have some quite large vector and
> matrix libraries that I would love to convert to use generics.
>
> Imagine my surprise when I found out that what I want is basically
> impossible. I want a complex number class that can work with any basic data
> type like so: complex<float>, complex<double>, complex<decimal> and so on.
> This is something that is done very often in C++ and one of the main
> applications of generics there.
>
> This was my first try (this is only an excerpt):
>
> struct complex<T>
> {
> public T re,im;
> complex<T>(T re,T im)
> {
> this.re=re;this.im=im;
> }
> complex<T> Sum(complex<T> a,complex<T> b)
> {
> return new complex<T>(a.re+b.re,a.im+b.im);
> }
> }
>
> Something like this would work in C++, since it does not have constraints on
> type parameters. But in .NET, when you specify a type parameter without
> constraints it is assumed to be a System.Object, which of course does not
> have a + operator.
>
> So I thought, probably there is a way to specify a method constraint for T
> such that T must have a certain (static) method or a certain operator
> method. But the only thing like this is the new() constraint to specify
> that a class must have a default constructor.
>
> My second thought was that there might be some interface like IArithmetic.
> This is of course complicated by the fact that interfaces can not contain
> static methods. But something like
>
> interface IArithmetic<T> {
> void Add(T a);
> void Subtract(T a);
> void Multiply(T a);
> void Divide(T a);
> }
>
> should do the trick. This would not be very elegant, but quite sufficient.
> Given that there is an interface called IComparable<T> this should not be
> too much to ask. Maybe there should even be something more granular like
>
> interface IAddable<T> {
> void Add(T a);
> }
>
> ....
>
> interface
> IArithmetic<T>:IAddable<T>,ISubtractable<T>,IMultipliable<T>,IDivisible<T>
> {
> }
>
> or something. This solution would be similar to the approach taken with
> IComparable and IComparable<T>.
>
> But no such interface exists in the System namespace. So I would have to
> wrap all the basic data types into structs that actually implement this
> interface, like so:
>
> struct ArithmeticInt : IArithmetic<int> {
> private int value;
> ...
> }
>
> struct ArithmeticDouble : IArithmetic<double> {
> private double value;
> ...
> }
>
> But this would be a lot of work and, even worse, would lead to absymal
> performance since in my experience the .NET JIT compiler is too dumb to get
> rid of the wrapper code.
>
> There are of course some workarounds like having a separate type parameter
> for the operations, like this:
>
> struct Complex<T,Ops> where Ops:IArithmeticOps<T>
> {
> ...
> }
>
> But this yields inacceptable performance.
>
> What is really required is a way to specify *method* *constraints* instead
> of just interface constraints and the new() constraint.
>
> Another option would be to allow static methods in interfaces and to provide
> an IArithmethic interface in the System namespace, but I would prefer the
> first option.
>
> Without something like this, generics are only good for typed collections.
> Adding so much new syntax and complexity just to make collections faster
> and more type safe seems like a waste of time!
>



Relevant Pages

  • Re: Fun with generics
    ... description of the purpose of generics. ... so what you need to communicate is the type parameter to ... public interface Table ... using ArrayList is that if someone wants to create a Foo that only works ...
    (comp.lang.java.programmer)
  • Generics in .NET 2.0 SUCK
    ... I just downloaded Visual C# Express Edition to mess with .NET 2.0 generics. ... Something like this would work in C++, since it does not have constraints on ... My second thought was that there might be some interface like IArithmetic. ... There are of course some workarounds like having a separate type parameter ...
    (microsoft.public.dotnet.languages.csharp)
  • Re: C# Generic Constraint Improve Way (Jethro Guo)
    ... constraint class TRef is automatically matched up with the type parameter TRef without a where clause, ... Type parameter names are normally local to the generic class/method where they're declared - one class's TKey might have nothing in common with another class's TKey. ... the newconstraint would be irksome as AFAIK it would match any constructor that takes a string, not necessarily one that is named "session" or has the same meaning. ... Doable but doesn't seem in the spirit of generics. ...
    (microsoft.public.dotnet.languages.csharp)
  • Re: Cast generic IFoo : last level (I hope)
    ... interface learned me a lot, but I can't find a way because of my particular ... I'll point out that I've never seen correct code where the type parameter is constrained to inherit the type in which it's being used. ... It's possible that there's some esoteric use of generics that I'm unfamiliar with where it comes up, but the few times I've played around with that construct myself, I've gotten nowhere and coded myself into logical impossibilities. ...
    (microsoft.public.dotnet.languages.csharp)
  • Re: can constraint generics using string or not ?
    ... a non-sealed class or a type parameter ... Why can't I constraint using string but I can constraint like bellow and ... Since this is not a valid use of generics, possibly you are trying to solve a problem for which there is a better way than generics. ...
    (microsoft.public.dotnet.languages.csharp)