为什么扩展方法调用不明确?

时间:2012-07-29 16:39:51

标签: c# parameters struct extension-methods

我有这些扩展名:

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)是一个结构,这是在每个扩展的最顶部指定的?

4 个答案:

答案 0 :(得分:2)

答案 1 :(得分:0)

因为返回类型不是Nullable而你将4转换为可以为空的int

int? time = ((int?)4).With(T => TimeSpan.FromSeconds(T))
// Error. The call is ambiguous.

答案 2 :(得分:0)

因为return typeconstraints不是方法签名的一部分。

答案 3 :(得分:0)

通用约束不会影响重载决策。当你省略第二个参数时,编译器很难确定会发生什么。