【问题标题】:Transfer NULL to the constructor将 NULL 传递给构造函数
【发布时间】: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 不是最佳实践(不仅在构造函数中)。

标签: c# constructor overloading constructor-overloading


【解决方案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) 更喜欢它的构造函数的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-24
    • 2012-01-15
    • 1970-01-01
    • 2012-08-13
    相关资源
    最近更新 更多