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.