参数中泛型字符串和简单字符串之间的歧义

时间:2018-10-31 14:42:37

标签: c# .net generics ambiguous-call

我有2种方法,其中一种适用于泛型参数,另一种适用于常规字符串。看起来像这样:

public static async Task PostAlertAsync(this IQueueService queueService,
    AlertTypes alertType,
    string orgId, 
    AlertDetailsBase details = null)
{
    Guard.ArgumentNotNull(queueService, nameof(queueService));
    Guard.ArgumentNotNullOrEmptyString(orgId, nameof(orgId));

    var alertMessage = BuildAlertQueueMessage(alertType, orgId, details);
    await queueService.SendMessageAsync(alertMessage);
}

public static async Task PostAlertAsync<T>(this IQueueService queueService, 
    AlertTypes alertType, 
    T source,
    AlertDetailsBase details = null, 
    string customSubject = null)
    where T: IAlertSource
{
    Guard.ArgumentNotNull(queueService, nameof(queueService));
    Guard.ArgumentNotNull(source, nameof(source));

    var alertMessage = BuildAlertQueueMessage<T>(alertType, source, details, customSubject);
    await queueService.SendMessageAsync(alertMessage);
}

我想知道,为什么调用带有歧义错误的编译下一个调用结果? String在这种情况下显然没有实现IAlertSource

QueueServiceCollection.Alerts.PostAlertAsync(AlertTypes.AzureAdDsProvisionCompleted, orgId);

有什么想法吗?谢谢。

1 个答案:

答案 0 :(得分:2)

简单地说:在确定要使用哪种方法重载时,不使用where限制。因此,当您忽略该信息时,使用哪个重载就变得不明显了。您可能会说确切的马赫数更好,但事实并非如此。如果不考虑此信息,则可以使用字符串作为参数来调用这两种方法。