Program Tip

생성자에 NULL 전송

programtip 2020. 12. 4. 20:20
반응형

생성자에 NULL 전송


생성자가 매개 변수로 실행되는 이유를 이해할 수 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");
        }
    }
}

첫 번째 생성자는 참조 유형의 매개 변수를 사용하기 때문에 생각합니다. null참조 유형의 기본값 이므로 참조 매개 변수가있는 첫 번째 생성자입니다 .

그러나 나는 왜 그렇지 않은지 이해하지 못하며 object참조 유형이기도합니다.


하지만 왜 물건이 없는지 이해할 수 없습니까? 그것은 또한 참조 유형입니까?

예, double[]둘 다 object참조 유형이므로 null암시 적으로 둘 다로 변환 할 수 있습니다. 그러나 멤버 오버로딩은 일반적으로보다 구체적인 형식을 선호하므로 double[]생성자가 사용됩니다. 자세한 내용은 C # 사양의 7.5.3 섹션을 참조하십시오 (그리고 많은 세부 정보가 있습니다).

특히 섹션 7.5.3.5에서 :

두 가지 유형 T1 및 T2가 주어지면 다음 중 하나 이상이 유지되는 경우 T1이 T2보다 더 나은 전환 대상입니다.

  • T1에서 T2 로의 암시 적 변환이 존재하고 T2에서 T1 로의 암시 적 변환이 없습니다.

곳, 여기에 사건 T1입니다 double[]하고 T2있다 object. 에서 암시 적 변환 거기 double[]object있지만 가입일 암시 적 변환 object으로는 double[]그래서, double[]보다 더 나은 변환 대상이다 object.

object생성자를 강제로 사용하려면 다음을 캐스팅하십시오.

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

기본적으로, double[]입니다 object만, 모두 object들입니다 하지 double[] 에요. 으로 double[]보다 구체적인 옵션을이야 ', 컴파일러는 대부분 특정의 하나로서, 그것을 선택합니다.


이걸 고려하세요:

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

double [] d는 객체입니다.

따라서 이것을 고려하십시오.

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

object[] z are not double[]. There is no implicit conversion from object to double[].

참고URL : https://stackoverflow.com/questions/21664856/transfer-null-to-the-constructor

반응형