将 NULL 传递给构造函数

Posted

技术标签:

【中文标题】将 NULL 传递给构造函数【英文标题】:Transfer NULL to the constructor 【发布时间】:2014-03-07 01:19:33 【问题描述】:

我不明白为什么用参数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,它也是一个引用类型。

【问题讨论】:

你在这里自找麻烦。如果您要使用重载,则包含作为对象的一般类型将在某些时候导致痛苦 @DavidHeffernan IDK。在大多数情况下,我认为调用哪个方法是相当直观的。只有在没有其他方法可以调用时,才会调用对象 one。直觉上这是有道理的,因为相反是无稽之谈 这是一个很好的面试问题! :) 如果您添加另一个具有其他引用类型的构造函数,您将出现此错误“调用不明确” 只要遵循一些好的做法,你就不会遇到这样的问题。在构造函数中,您应该传递一个创建的对象不能没有的依赖项。所以传递 null 不是最佳实践(不仅在构造函数中)。 【参考方案1】:

但我不明白为什么没有对象?也是引用类型?

是的,double[]object 都是引用类型,所以 null 可以隐式转换为它们。但是,成员重载通常有利于更具体的类型,因此使用double[] 构造函数。有关更多详细信息,请参阅 C# 规范的第 7.5.3 节(男孩有很多详细信息)。

尤其是第 7.5.3.5 节:

鉴于 T1 和 T2 两种不同的类型,如果至少满足以下条件之一,T1 是比 T2 更好的转化目标:

存在从 T1 到 T2 的隐式转换,不存在从 T2 到 T1 的隐式转换

这里就是这种情况,T1double[]T2object。存在从double[]object 的隐式转换,但没有从objectdouble[] 的隐式转换,因此double[] 是比object 更好的转换目标。

如果你想强制使用object 构造函数,只需强制转换:

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

【讨论】:

不是double[]object 吗? @KhaledAKhunaifer:是的,所以如果过载double[]存在,它会调用过载object - 但是因为过载@987654341 @ 比采用 object 的重载更具体,这是选择的那个。【参考方案2】:

基本上,double[]object,但所有 objects 都不是 double[]s。由于double[] 是更具体的选项,因此编译器选择它作为最具体的选项。

【讨论】:

【参考方案3】:

考虑一下:

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 不是 double[]。 没有从 object 到 double[] 的隐式转换。

【讨论】:

虽然这些都是真实的观察结果,但这个答案本身并不能回答为什么 new D(null) 更喜欢它的构造函数的问题。

以上是关于将 NULL 传递给构造函数的主要内容,如果未能解决你的问题,请参考以下文章

将 const char* 传递给构造函数会给出 null

将数组传递给构造函数会产生大小为 1 的数组? [复制]

为啥我必须将道具传递给构造函数和超级[重复]

将对象数组传递给构造函数[重复]

将数组常量传递给枚举构造函数[重复]

无法将类实例传递给构造函数