many how hashtags hashtagify c# constructor overloading constructor-overloading

c# - how - instagram hashtags 2018



Transferir NULL al constructor (3)

Pero no puedo entender por qué no hay objeto? También es un tipo de referencia?

Sí, tanto double[] como object son tipos de referencia, por lo que null es implícitamente convertible para ambos. Sin embargo, la sobrecarga de miembros generalmente favorece a tipos más específicos, por lo que se usa el constructor double[] . Consulte la sección 7.5.3 de la especificación C # para obtener más detalles (y hay muchos detalles).

En particular, de la sección 7.5.3.5:

Dado dos tipos diferentes T1 y T2, T1 es un objetivo de conversión mejor que T2 si se cumple al menos uno de los siguientes:

  • Existe una conversión implícita de T1 a T2, y no existe una conversión implícita de T2 a T1

Ese es el caso aquí, donde T1 es double[] y T2 es un object . Hay una conversión implícita del double[] al object , pero no hay conversión implícita del object al double[] , por lo que el double[] es un mejor objetivo de conversión que el object .

Si quieres forzar el uso del constructor de object , solo envía:

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

No puedo entender por qué el constructor se ejecuta con el parámetro 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"); } } }

Creo que porque el primer constructor toma un parámetro de tipo de referencia. El primer constructor con un parámetro de referencia porque null es el valor predeterminado para los tipos de referencia.

Pero no entiendo por qué no object , también es un tipo de referencia.


Básicamente, double[] es un object , pero todos los object s no son double[] s. Como el double[] es la opción más específica, el compilador lo elige, como el más específico.


Considera esto:

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

double [] d es un objeto.

Así que considera esto:

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

objeto [] z no son dobles []. No hay conversión implícita de objeto a doble [].