2 votes

Impossible d'effectuer une liaison d'exécution sur une référence nulle sur un type Nullable.

J'ai donc cherché dans les autres questions relatives aux exceptions NullReferenceException et aux liaisons d'exécution sur SO, mais je n'ai pas trouvé de réponse à cette question.

En gros, j'ai le code ci-dessous. La méthode ManipulateConcrete renvoie False, comme vous vous y attendez, mais la méthode Manipulate jette

Une exception 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' s'est produite dans System.Core.dll

Informations complémentaires : Impossible d'effectuer une liaison d'exécution sur une null

Code :

    class Program
    {
        static void Main(string[] args)
        {
            var myClassInstance = new MyClass() { MyGuid = null };

            ManipulateConcrete(myClassInstance);
            Manipulate(myClassInstance);
            Console.ReadLine();
        }

        static void Manipulate(dynamic myClass)
        {
            Console.WriteLine(myClass.MyGuid.HasValue);
        }

        static void ManipulateConcrete(MyClass myClass)
        {
            Console.WriteLine(myClass.MyGuid.HasValue);
        }

    }

    class MyClass
    {
        public Guid? MyGuid;
    }

Est-ce que je rate quelque chose de vraiment évident ? Ou s'agit-il d'une limitation de la dynamique ? Si c'est le cas, quelqu'un connaît-il la raison sous-jacente de ce phénomène ?

2voto

svick Points 81772

Lorsque vous utilisez dynamic les types statiques ne sont pas pris en compte. Ainsi, dans Manipulate la valeur de myClass.MyGuid est null tapé comme dynamic . Et dynamic ne sait pas comment accéder aux propriétés d'une null l'instance, donc il jette.

Une façon de résoudre ce problème est de comparer avec null au lieu d'utiliser .HasValue :

Console.WriteLine(myClass.MyGuid != null);

Une autre option serait de se débarrasser de dynamic en faisant un casting vers Guid? :

Guid? guid = myClass.MyGuid;

Console.WriteLine(guid.HasValue);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X