除可选参数外具有相同签名的两个方法

Two methods with the same signature except for optional parameter

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

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

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

我知道,当使用空参数调用时,这会导致调用不明确,但令我惊讶的是,这甚至被允许作为声明本身。谁能解释一下,为什么会这样?

代码肯定能正常编译,因为你在第二个方法中把入参的类型改成了String,这也涉及到一个method.This的签名会进行方法重载。 希望这能回答你的问题。

实际上您的程序编译正常直到您至少有一个 GetCategories Async() 调用。然后你会得到"error CS0121: The call is ambiguous".

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

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

当然,您可以对这两种方法使用 'No Parameters' 的行为,方法是传递正确类型的默认值。

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

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

GetCategoriesAsync(1);

因此,出于显而易见的原因,代码将起作用。

但是,如果进行了调用,例如:GetCategoriesAsync(),它现在会抛出一个编译错误:

error CS0121: The call is ambiguous

原因是它在错误消息中明确指出,没有最匹配的方法,因为它可以很容易地同时满足这两种方法。

有趣的是,如果函数有空重载,即

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

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

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

虽然我不推荐它。