Ho avuto diverse volte la tentazione di farlo ma poi, vuoi per impegni, vuoi per pigrizia, non mi sono mai deciso.
Questa volta ho deciso di iniziare a scrivere qualcosa, anche se non sono certo di mantenere fede all'impegno...

Sto studiando a tempo perso le specifiche di C# 2.0 e sto provando a compilare il codice sia con il compilatore Microsoft (v2.0.40607), sia con il compilatore Mono (gmcs, v1.1.6 per Windows).
Si consideri il seguente codice:

using System;

class Class1<T>
{
    public void Method0(T x)
    {
        Console.WriteLine("public void Method0(T x)");
    }

    public void Method0(int x)
    {
        Console.WriteLine("public void Method0(int x)");
    }
}
class Program
{
    static void Main(string[] args)
    {
        Class1<int> obj1 = new Class1<int>();   // [1]
        obj1.Method0(10);   // [2]

        Console.ReadLine();
    }
}

Compilando con il csc (compilatore Microsoft) non ottengo nessun errore neanche eliminando i commenti [1] e [2].
Se compilo invece con gmcs ottengo:

Program.cs(11) error CS0408: `Class1<T>' cannot define overload members that may
 unify for some type parameter substitutions
Compilation failed: 1 error(s), 0 warnings

In questo caso il compilatore gmcs sembra essere accurato mentre quello Microsoft non sembra aderire alle specifiche di C# 2.0.
Il compilatore Mono genera l'errore anche se commento le linee [1] e [2], quindi previene potenziali errori anche senza aver effettivamente creato un instance type che lo potrebbe generare.

Si consideri invece il seguente codice:

using System;

class Class1<U, V>
{
    public void Method1(U u)
    {
        Console.WriteLine("public void Method1(U u)");
    }

    public void Method1(V v)
    {
        Console.WriteLine("public void Method1(V v)");
    }
}

class Program
{
    static void Main(string[] args)
    {
        Class1<int, int> obj2 = new Class1<int, int>(); // [1]
        obj2.Method1(10);   // [2]

        Console.ReadLine();
    }
}

Se commento le linee [1] e [2], csc non genera nessun errore, mentre gmcs rileva già la potenziale ambiguità nell'overload. Se invece commento solo la linea [2], csc continua a non accorgersi del problema, mentre gmcs sì. Se non commento nessuna delle due linee allora anche csc segnala l'ambiguità nell'overload.

Si consideri infine il seguente codice:

using System;

class Class1<U, V>
{
    public void Method1(U u, V v)
    {
        Console.WriteLine("public void Method1(U u, V v)");
    }

    public void Method1(V v, U u)
    {
        Console.WriteLine("public void Method1(V v, U u)");
    }
}

class Program
{
    static void Main(string[] args)
    {
        Class1<int, int> obj2 = new Class1<int, int>(); // [1]
        obj2.Method1(10);   // [2]

        Console.ReadLine();
    }
}

gmcs continua a segnalare l'ambiguità anche se commento le linee [1] e [2]. csc segnala invece errore soltanto nel momento in cui tolgo il commento alle linee [1] e [2].

Proverò anche con sscli e Gyro. Vedremo poi con la prossima Beta2 del .Net Framework di Microsoft.