C# 方法的不明确调用

C# 方法的不明确调用,c#,ambiguity,C#,Ambiguity,我有以下代码 class Program { static void Main() { A a = new A(); a.M(null); } } class A { public void M(int? i) { } public void M(string s) { } } 我有一个错误,因为呼叫不明确。我需要在不向Main方法添加任何行和访问类A的情况下更改M方法的调用,以便它变得正确。有人能告诉

我有以下代码

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

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

    public void M(string s)
    { }
}

我有一个错误,因为呼叫不明确。我需要在不向Main方法添加任何行和访问类A的情况下更改M方法的调用,以便它变得正确。有人能告诉我怎么做吗?

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

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

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

《高级话题》认为埃里克的文章

编辑:

由于参数名称不同,因此可以使用命名参数,这些参数在C#4.0中可用:

a.M(i : null);


您可以使用强制转换,或,或用于
int?
new int?()
(由于,这也与
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);

答案是,如果不能更改现有的呼叫站点,则不能以这种方式重载成员M


假设您正在添加这两个方法中的一个,并且可以更改对新方法的调用的调用位置。更改这些新呼叫站点要使用的方法的名称。

定义正确吗?应该调用哪个方法?要调用哪个方法并将列表四舍五入您也可以使用
new int?()
@EricLippert获取完整列表:
a.M(i:null)
,因为参数名称是different@IlyaIvanov:好的!我喜欢。:)我已经添加了这两个。除了“传入变量”方法的变体之外,还有其他方法吗?我想不出任何方法。可能是
a.M(null为string)
,但这只是cast在本例中的一个变体。问题是他不能向呼叫站点添加新的代码行,不是说他不能更改它们,所以其他答案在技术上仍然正确。@Servy我读到“不能添加新行”是指“不能修改任何行”因为不能修改但不能添加行是没有意义的。是否存在某种必须避免的行数限制?
我需要更改M方法的调用,而不向Main方法添加任何行并访问类A,以便它变得正确
这是我可以想象的模糊。在我的回答中,我在哪里添加了行?@IlyaIvanov将“M的呼唤”理解为“M的签名”,将“不添加任何行”理解为“不修改任何行”(根据上述论点)。我同意我对这个措辞拙劣的问题的解释会引起争论,但我的钱就在这个解释上。
a.M(s : 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);