【发布时间】:2020-12-17 08:16:59
【问题描述】:
我有这个服务接口。
public interface IService
{
Task SetAsync(string key, string value, TimeSpan? expiration = null);
Task SetAsync<T>(string applicationName, string key, T value, TimeSpan? expiration = null);
}
我想这样调用第一个方法。
service.SetAsync("Key", "Value", TimeSpan.FromMinutes(1));
方法调用与第一个方法的约定 100% 匹配。然而编译器通过假设TimeSpan 是我的泛型类型来选择第二种方法。
为什么会这样?
【问题讨论】:
-
它对后面的参数有默认值,这会让事情变得很糟糕。我会尝试找到一个合适的副本
-
运行其他方法的简单解决方法是明确指定其参数名称:
service.SetAsync(key:"Key", "Value", TimeSpan.FromMinutes(1));(fiddle) -
试试
new Service().SetAsync("Key", "Value", new TimeSpan?());。因为TimeSpan.FromMinutes(1)是TimeSpan而不是TimeSpan? -
@Damien_The_Unbeliever:我希望不需要默认参数来使 first 方法更可取。正在调查...
-
如果您传递一个非空值,那么它会采用第一种方法,或者将您的方法上的
TimeSpan?替换为TimeSpan,它也将采用第一种方法。