7

以下代码会导致编译器错误,因为它是模棱两可的调用,但如果我们使用object而不是ArrayList没有错误发生问题并且string版本工作正常;你对此有什么解释吗?

class A
{
    public A(string x)
    {
        Console.WriteLine("string");
    }
    public A(ArrayList x)
    {
        Console.WriteLine("ArrayList");
    }

}
    static void Main(string[] args)
        {
            A o = new A(null);
        }
4

6 回答 6

16

如果您更改采用 an 的构造函数,您的代码可以正常工作的原因ArrayListobjectC# 编译器将选择最适用的特定类型。在string/的情况下objectstring实际上派生object并因此“更具体”,并将由编译器推断。与stringvs ArrayList,它是苹果和橙子:两者都可以为空,但都没有比另一个更“具体”。

于 2010-05-19T12:32:24.227 回答
4

我可能是错的,但我认为将 ArrayList 更改为 object 时它起作用的原因是因为 string 继承自 object 并且它决定使用更具体的字符串版本。当它是字符串和 ArrayList 时,它不知道使用哪一个。

于 2010-05-19T12:32:11.090 回答
3

null可以表示 astringArrayList. 没有关于您指的是哪个版本的方法(在本例中为构造函数)的信息。

您可以通过强制转换强制它使用特定的:

static void Main(string[] args)
    {
        A o = new A((string)null);
    }

...或者实现一个行为如你所愿的构造函数(不带参数)

于 2010-05-19T12:27:51.133 回答
2

您可以使用default关键字 like 来解决这种情况,代码将是:

A o = new A(default(ArrayList)); 

或者

A o = new A(default(string)); 
于 2014-03-21T10:38:01.990 回答
1
  1. 当然它是模棱两可的:null可以是 astring或 an ArrayList。您需要对其进行限定,例如(string) null.
  2. 你知道那ArrayList已经被弃用了吗?您应该改用其中一种通用集合类型
于 2010-05-19T12:29:01.407 回答
1

ArrayList并且string都是nullable类型。这使编译器感到困惑。

如果您有两个构造函数,说一个采用可空类型 egArrayList和另一个采用non-nullableeg 类型int。代码将编译并选择具有nullable类型的构造函数。

但是,如果您有多个采用nullable类型的构造函数,那么就像@Dan Tao说的那样,它是苹果和橙子:两者都可以为空,但两者都不比另一个更“具体”。

例如:

class A
{
    public A(int x)
    {
        Console.WriteLine("string");
    }
    public A(ArrayList x)
    {
        Console.WriteLine("ArrayList");
    }

}

此代码可以编译,但如果您更改public A(int x)tpublic A(int? x)它不会。

于 2010-05-19T12:47:29.510 回答