3

我得到了这些扩展:

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 (作为 a TResult)是一个结构,它在每个扩展的最顶部指定,这不是很明显吗?

4

4 回答 4

2

因为约束不是签名的一部分

于 2012-07-29T16:44:59.587 回答
0

第一个错误的原因是返回类型不是 Nullable 并且您将 4 转换为可为 null 的 int

int? time = ((int?)4).With(T => TimeSpan.FromSeconds(T))
// Error. The call is ambiguous.
于 2012-07-29T16:43:23.220 回答
0

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

于 2012-07-29T16:45:51.693 回答
0

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

于 2012-07-29T16:47:57.470 回答