将 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 的隐式转换
这里就是这种情况,T1
是 double[]
,T2
是 object
。存在从double[]
到object
的隐式转换,但没有从object
到double[]
的隐式转换,因此double[]
是比object
更好的转换目标。
如果你想强制使用object
构造函数,只需强制转换:
D myD = new D((object) null);
【讨论】:
不是double[]
和object
吗?
@KhaledAKhunaifer:是的,所以如果过载double[]
不存在,它会调用过载object
- 但是因为过载@987654341 @ 比采用 object
的重载更具体,这是选择的那个。【参考方案2】:
基本上,double[]
是 object
,但所有 object
s 都不是 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 传递给构造函数的主要内容,如果未能解决你的问题,请参考以下文章