2014-02-09 14 views
60

Double[] 매개 변수로 생성자가 실행되는 이유를 이해할 수 없습니까?NULL을 생성자에 전달하십시오.

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이 아니라는 것을 이해하지 못합니다. 참조 유형이기도합니다.

+12

여기에 문제가 있습니다. 오버로드를 사용하려는 경우 객체로 일반적인 유형을 포함하면 어떤 점에서 고통이 발생합니다 –

+1

@DavidHeffernan IDK.대부분의 경우에 어떤 메소드가 호출되는지는 다소 직관적이라고 생각합니다. 객체는 호출 할 수없는 경우에만 호출됩니다. 직관적으로 이것은 반대로 말도 안되기 때문에 의미가 있습니다. – Cruncher

+2

이것은 훌륭한 인터뷰 질문입니다! :) –

답변

90

하지만 왜 객체가 없는지 이해할 수 없습니까? 참조 유형이기도합니다.

, double[]object 모두 그렇게 null이 둘을 암시 적으로 변환하고, 참조 유형입니다. 그러나 멤버 오버로드는 일반적으로 더 구체적인 형식을 선호하므로 double[] 생성자가 사용됩니다. 자세한 내용은 C# 사양의 7.5.3 단원을 참조하십시오 (소년에게는 많은 세부 정보가 있습니다). 섹션 7.5.3.5에서 특히

, 다음 중 적어도 하나를 보유하는 경우

감안할 때 두 가지 유형의 T1 및 T2는 T1이 T2보다 나은 변환 대상 :

  • T2에 T1에서 암시 적 변환이 존재하고, T1을 T2로부터 암시 적 변환은 여기에 케이스의

, 01 존재하지 않는다은 double[]이고 T2object입니다. double[]에서 object으로의 암시 적 변환이 있지만 object에서 double[]으로의 암시 적 변환이 없으므로, 이 object보다 우수한 변환 대상입니다.

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

은'double []''객체'가 아닙니다. –

+3

@KhaledAKhunaifer : 예,'double []'*을 사용하는 과부하가 존재하지 않으면'object'를 사용하는 과부하를 호출합니다 - 그러나'double []'을 사용하는 과부하는 과부하 'object'는 그것이 선택된 객체입니다. –

19

는 기본적으로 double[]object이지만, 모든 object하지double[]의 위치 :

당신이 object 생성자의 사용을 강제하려는 경우

, 그냥 캐스팅. double[]이 더 구체적인 옵션이므로, 컴파일러는 그것을 가장 구체적인 것으로 선택합니다.

2

이 있다면 :

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

더블 [] D가 목적이다.

그래서이 사항을 고려하십시오

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

객체 [] Z는 [] 두 번되지 않습니다. 개체에서 double [] 로의 암시 적 변환이 없습니다.

+2

이것들은 참된 관찰이지만,이 답변은 독자적으로 왜'new D (null)'이 생성자를 선호하는지에 대한 질문에 대답하지 않습니다. – doppelgreener