(~ software sucks)

DoSomething(string foo = "WTF")

Publié le 04-08-2025

Ça maintenant quelques mois que j’écris du C# au quotidien, l’occasion pour moi de découvrir quelques joyeusetés.

Il y a quelques semaines, je voulais changer la signature d’une méthode et, pour éviter de tout casser, avoir une valeur par défaut.

Comme toute bonne codebase OOP, on ne dépend pas de classes concrètes mais d’interface.

Donc la question est : à quel niveau mettre la valeur par défaut.

Et la réponse est : on peut la mettre à peu près partout.

Par exemple:

interface IFoo {
    void DoSomething(string foo = "from the interface");
}

class Foo : IFoo {
    void DoSomething(string foo = "from the class") =>
        Console.WriteLine($"Hello {foo}");
}

Et à l’usage, ça dépendra du type qu’on donne à la variable:

var foo = new Foo();

// Outputs "Hello from the class"
foo.DoSomething();

IFoo foo = new Foo();

// Outputs "Hello from the interface"
foo.DoSomething();

Évidemment, si naïvement on enlève la valeur par défaut dans la méthode de la classe concrète pensant qu'on utilisera celle de l’interface : nope nope.

class Foo : IFoo {
    void DoSomething(string foo) =>
        Console.WriteLine($"Hello {foo}");
}

var foo = new Foo();

// ça compile pas (╯°□°)╯︵ ┻━┻
foo.DoSomething();

Vous avez maintenant une nouvelle manière d’introduire des bugs dans votre codebase, ne me remerciez pas.

Voilà, c’était tout pour aujourd’hui.