Questo post di Diego Martelli, fattomi notare da un amico, riesce secondo me a sorprendere un comportamento interessante di C#, ovvero il seguente snippet di codice entra in stack overflow:
using System;
class Foo {
public virtual void Write(string s) {
Console.WriteLine("Foo virtual " + s);
}
}
class Bar : Foo {
public override void Write(string s) {
Console.WriteLine("Bar override " + s);
}
public void Write(string s, params string[] args) {
Write("Bar overload " + s);
}
}
class Program {
static void Main() {
Bar bar = new Bar();
bar.Write("Ciao!");
}
}
Probabilmente molti si aspetterebbero che venisse stampato "Bar override Ciao!" a console e invece il metodo chiamato e' il Write con l'elenco variabile di parametri e non il metodo in override. Questo comportamento e' dovuto, secondo me, al fatto che abbiamo istanziato bar come:
Bar bar = new Bar();
e non come:
Foo bar = new Bar();
Il metodo Write in override nella classe Bar non fa altro che specializzare il metodo virtuale della classe base Foo, percio' perde nella gara dei metodi in overload della classe Bar perche' Write nella sua forma espansa (ECMA-334, 14.4.2.1) ha un parametro di tipo string e zero elementi nell'array di parametri.
Detto questo, ecco il mio quiz: Cosa stampa questo snippet a console?
using System;
class Foo {
public override string ToString() {
return "override ";
}
public string ToString(params string[] args) {
return "overload ";
}
}
class Program {
static void Main() {
Foo foo = new Foo();
Console.Write(foo);
Console.WriteLine(foo.ToString());
}
}
- A: override override
- B: override overload
- C: overload overload
:-)