La chaîne de constructeurs doit être déterminée avec certitude au moment de la compilation - le compilateur doit choisir une surcharge pour pouvoir créer une IL valide. Alors que normalement la résolution des surcharges (par exemple pour les appels de méthode) peut être différée jusqu'au moment de l'exécution, cela ne fonctionne pas pour les appels de constructeurs chaînés.
EDIT : Dans du code C# "normal" (avant C# 4, en gros), tous La résolution des surcharges est effectuée au moment de la compilation. Cependant, lorsqu'une invocation de membre implique une valeur dynamique, celle-ci est résolue au moment de l'exécution. Prenons l'exemple suivant :
using System;
class Program
{
static void Foo(int x)
{
Console.WriteLine("int!");
}
static void Foo(string x)
{
Console.WriteLine("string!");
}
static void Main(string[] args)
{
dynamic d = 10;
Foo(d);
}
}
Le compilateur n'émet pas un appel direct à Foo
ici - il ne peut pas, parce que dans l'appel Foo(d)
il ne sait pas à quelle surcharge il doit se résoudre. Au lieu de cela, il émet du code qui fait une sorte de mini-compilation "juste à temps" pour résoudre la surcharge avec la méthode réel de la valeur de d
au moment de l'exécution.
Cela ne fonctionne pas pour le chaînage de constructeurs, car une IL valide doit contenir un appel à un constructeur de classe de base spécifique. (Je ne sais pas si la version dynamique ne peut même pas être exprimée sur en IL, ou si elle le peut, mais le résultat serait invérifiable).
On pourrait argumenter que le compilateur C# devrait être capable de dire qu'il n'y a en fait qu'un seul constructeur visible qui puede sera appelé, et ce constructeur sera toujours être disponible... mais une fois qu'on s'engage dans cette voie, on se retrouve avec une langue qui est muy compliqué à spécifier. Les concepteurs de C# adoptent généralement la position d'avoir des règles plus simples qui, parfois, ne sont pas aussi puissantes que vous le souhaiteriez.