除了可选参数

时间:2015-11-27 16:54:45

标签: c# overloading optional-parameters

我一直在研究我的项目,并且无意中编写了两个具有相同签名的方法,但可选参数除外。令我惊讶的是,代码正常编译。

public async Task<List<CategoryApiModel>> GetCategoriesAsync( int contentLanguageId = 0 )
{
    ...
}

public async Task<List<CategoryApiModel>> GetCategoriesAsync( string languageTag = "" )
{
    ...
}

我知道,当使用空参数调用时,这将导致调用不明确,但我很惊讶这甚至被允许作为声明本身。有人可以解释一下,为什么会这样?

5 个答案:

答案 0 :(得分:1)

代码肯定会正常编译,因为你在第二种方法中将输入参数的类型更改为String,这也是方法的签名。这将执行方法重载。 希望这能回答你的问题。

答案 1 :(得分:1)

实际上,您的程序通常会编译,直到您至少有一个GetCategoriesAsync()调用。然后你会得到“错误CS0121:电话不明确”。

答案 2 :(得分:1)

存在一个问题并且会出现编译错误,但只有当某些代码实际上尝试使用其中一个带有模糊参数的方法时才会出现。

如果您说两个文件,每个文件定义这两个函数中的一个,这可能是有用的(如果可能是草率和混乱)。如果只有一个在范围内,则可以使用默认参数,并且不会对编译器不明确。但当然这可能被认为是草率的,因为它可能会导致一个可能不会被注意到的错误。

答案 3 :(得分:0)

当然,您可以通过传递正确类型的默认值来为两种方法使用“无参数”的行为。

例如为: GetCategoriesAsync(0)用于第一个方法调用。 GetCategoriesAsync("")用于第二个方法调用。 因此,行为将与您未传递参数相同,因为您传递的是默认值(请注意,默认值不是该类型的默认值,而是在方法中手动设置的默认值,如果没有提供参数)

答案 4 :(得分:0)

代码编译正常,因为可以通过将正确的参数传递给它们来单独调用overloads

GetCategoriesAsync(1);

因此,显而易见的原因是代码可以正常工作。

但是如果进行了调用,如下所示:GetCategoriesAsync(),它现在抛出编译错误:

  

错误CS0121:呼叫不明确

在错误消息中明确说明的原因是,该方法没有最佳匹配,因为它可以很容易地适合这两种方法。

值得注意的是,如果函数存在空载,即

public async Task<List<CategoryApiModel>> GetCategoriesAsync()
{}

代码将编译,因为它将使用该调用。因此,可以通过执行以下操作来转移问题:

public async Task<List<CategoryApiModel>> GetCategoriesAsync()
{
     return GetCategoriesAsync(0);
}

虽然我不推荐它。