60 votes

Transférer NULL au constructeur

Je ne comprends pas pourquoi le constructeur est exécuté avec le paramètre Double[] ?

 using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MyConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            D myD = new D(null);
            Console.ReadLine();           
        }

    }

    public class D
    {
        public D(object o)
        {
            Console.WriteLine("Object");
        }
        public D(double[] array)
        {
            Console.WriteLine("Array");
        }
        public D(int i)
        {
            Console.WriteLine("Int");
        }
    }
}
 

Je pense que le premier constructeur prend un paramètre de type référence. Le premier constructeur avec un paramètre de référence car null est la valeur par défaut pour les types de référence.

Mais je ne comprends pas pourquoi object , c’est aussi un type de référence.

90voto

Jon Skeet Points 692016

Mais je ne comprends pas pourquoi aucun objet? C'est aussi un type de référence?

Oui, les deux double[] et object sont des types référence, de sorte null est implicitement convertible pour deux d'entre eux. Toutefois, membre de la surcharge favorise en général les plus spécifiques de types, de sorte que l' double[] constructeur est utilisé. Voir la section 7.5.3 de la spécification C# pour plus de détails (et le garçon y en a beaucoup de détails).

En particulier, à partir de la section 7.5.3.5:

Compte tenu de deux types T1 et T2, T1 est un meilleur taux de conversion que la cible de T2, si au moins l'une des opérations suivantes:

  • Une conversion implicite de T1 à T2 existe, et pas de conversion implicite de T2 à T1 existe

C'est le cas ici, où l' T1 est double[] et T2 est object. Il y a une conversion implicite de double[] de object, mais pas de conversion implicite de object de double[], alors double[] est un meilleur taux de conversion que la cible de object.

Si vous voulez forcer l'utilisation de l' object constructeur, juste lancer:

D myD = new D((object) null);

19voto

It'sNotALie. Points 10674

Fondamentalement, double[] est un object , mais tous les object s ne sont pas double[] s. Comme double[] est l'option la plus spécifique, le compilateur la choisit comme étant la plus spécifique.

2voto

Test Points 9555

Considère ceci:

 double[] d = new double[] {};
Console.WriteLine(d is object);//output is True
 

double [] d est un objet.

Alors considérez ceci:

 object z = new object[] {};
Console.WriteLine(z is double[]);//output is False
 

les objets [] z ne sont pas doubles []. Il n'y a pas de conversion implicite d'objet en double [].

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