-4

我有以下代码

class Program
{
    static void Main()
    {
        A a = new A();
        a.M(null);
    }
}

class A
{
    public void M(int? i)
    { }

    public void M(string s)
    { }
}

我有一个错误,因为调用是模棱两可的。我需要更改 M 方法的调用而不向 Main 方法添加任何行并访问类 A 以使其正确。有人可以告诉我该怎么做吗?

4

3 回答 3

3

您可以使用显式强制转换:

A a = new A();
a.M((string)null);

或者

a.M((int?)null);

帮助编译器选择正确的重载。请注意,C# 编译器无法根据null文字确定要调用的方法重载。

对于高级主题,请考虑 Eric 的文章空文字的类型是什么?

编辑:

由于您的参数名称不同,您可以使用命名参数,这些参数自C# 4.0起可用:

a.M(i : null);

或者

a.M(s : null);
于 2013-09-23T17:31:51.433 回答
2

您可以使用强制转换,或default关键字,或 for int?new int?()(由于Nullable 类型的工作方式,它也与 相同null)。您还可以使用命名参数来消除歧义。或者,当然,如果您可以添加另一行,您可以在变量中声明您的值并将其传入。

// these call the int? overload
a.M(default(int?));
a.M((int?)null);
a.M(new int?());
a.M(i: null);
int? i = null;
a.M(i);

// these call the string overload
a.M(default(string));
a.M((string)null);
a.M(s: null);
string s = null;
a.M(s);
于 2013-09-23T17:34:31.727 回答
0

答案是如果你不能改变现有的调用站点,你就不能以这种方式重载成员 M。

大概您正在添加两种方法之一,并且可以更改调用站点以调用新方法。更改这些新呼叫站点要使用的方法名称。

于 2013-09-24T19:43:49.123 回答