我有这些扩展名:
internal static TResult With<TInput, TResult>
(this TInput? o, Func<TInput, TResult> selector, TResult defaultResult = null)
where TInput : struct
where TResult : class
{
selector.ThrowIfNull("selector");
return o.HasValue ? selector(o.Value) : defaultResult;
}
internal static TResult? With<TInput, TResult>
(this TInput? o, Func<TInput, TResult> selector, TResult? defaultResult = null)
where TInput : struct
where TResult : struct
{
selector.ThrowIfNull("selector");
return o.HasValue ? selector(o.Value) : defaultResult;
}
第一个面向引用类型结果,第二个面向结构的Nullable。
那么现在为什么在第一行我得到了编译错误而在第二行我没有?
1
TimeSpan? time = ((int?)4).With(T => TimeSpan.FromSeconds(T))
// Error. The call is ambiguous.
2
TimeSpan? time = ((int?)4).With(T => TimeSpan.FromSeconds(T), null)
// No errors. Normally calls the second extension.
是不是因为TimeSpan(作为TResult
)是一个结构,这是在每个扩展的最顶部指定的?
答案 0 :(得分:2)
答案 1 :(得分:0)
因为返回类型不是Nullable而你将4转换为可以为空的int
int? time = ((int?)4).With(T => TimeSpan.FromSeconds(T))
// Error. The call is ambiguous.
答案 2 :(得分:0)
因为return type
和constraints
不是方法签名的一部分。
答案 3 :(得分:0)
通用约束不会影响重载决策。当你省略第二个参数时,编译器很难确定会发生什么。