Неоднозначность между общей и простой строкой в ​​параметрах - PullRequest
0 голосов
/ 31 октября 2018

У меня есть 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 голосов
/ 31 октября 2018

Проще говоря: where ограничения не используются при определении того, какой метод перегрузки должен использоваться. Поэтому, когда вы игнорируете эту информацию, становится неочевидным, какую перегрузку использовать. Вы можете утверждать, что точная машина лучше, но это не так. Оба метода могут быть вызваны с использованием строки в качестве параметра, если вы игнорируете эту информацию.

...