Il s'agit d'un problème lié au mode de fonctionnement de la dynamique : le liant d'exécution a un problème avec les conversions de l'expression System.Object
mais dans la pratique, ce n'est pas vraiment un problème.
Je pense que c'est parce que dynamic
au moment de l'exécution, est lui-même toujours System.Object
. La spécification de langage C# dans 4.7 déclare : "Le type dynamic est indiscernable de object at run-time". En tant que tel, tout objet utilisé comme dynamic est simplement stocké comme un objet.
Lorsque vous mettez une instance réelle de System.Object
dans une dynamique, il se passe quelque chose dans la résolution de liaison d'exécution qui provoque une exception de référence nulle.
Cependant, tout autre type qui n'est pas System.Object
fonctionne - même les types de référence et autres, sans faille. En tant que tel, cela devrait vous fournir le comportement approprié, puisqu'il n'y a vraiment aucune raison de créer une instance de System.Object
elle-même qui serait transmise - vous voudrez toujours une sous-classe avec d'autres informations sur le type.
Dès que vous utilisez un type "réel", cela fonctionne bien. Par exemple, ce qui suit fonctionne, même s'il est passé et traité comme Object
:
public class Program
{
public static T TryGetArrayValue<T>(object[] array_, int index_)
{
dynamic boxed = array_[index_];
return (T)boxed;
}
private static void Main()
{
int p = 3;
object a = p;
var objects = new[] { a, 4.5 };
// This works now, since the object is pointing to a class instance
object v = TryGetArrayValue<object>(objects, 0);
Console.WriteLine(v);
// These both also work fine...
double d = TryGetArrayValue<double>(objects, 1);
Console.WriteLine(d);
// Even the "automatic" int conversion works now
int i = TryGetArrayValue<int>(objects, 1);
Console.WriteLine(i);
Console.ReadKey();
}
}