생성자에 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
'Program Tip' 카테고리의 다른 글
CSS를 사용하여 콘텐츠 주위에 원을 만드는 방법은 무엇입니까? (0) | 2020.12.04 |
---|---|
`sizeof`가 * 정말 *`std :: size_t`로 평가됩니까? (0) | 2020.12.04 |
사전에서 비교할 때 키를 선택하기 위해 Python 3.5가 선택한 사항 (0) | 2020.12.04 |
명령 패턴 : 명령에 매개 변수를 전달하는 방법은 무엇입니까? (0) | 2020.12.04 |
정수를 십진수로 풀 수없는 이유는 무엇입니까? (0) | 2020.12.04 |