好吧,我一定是把标题弄错了。更多的代码,更少的文字:
public class Manager<T> where T : Control, new()
{
    void Manage()
    {
        Do(t => IsVisible(t));
    }
    bool IsVisible(T t)
    {
        return t.Visible;
    }
    S Do<S>(Func<T, S> operation)
    {
        return operation(new T());
    }
}
编译器很高兴Do. 它可以很容易地推断出T类型。现在让我们说我有这个:
public static class Util
{
    static void Manage()
    {
        Do(t => IsVisible(t)); //wiggly line here
    }
    static bool IsVisible<T>(T t) where T : Control
    {
        return t.Visible;
    }
    static S Do<S, T>(Func<T, S> operation) where T : Control, new()
    {
        return operation(new T());
    }
}
编译器希望现在显式键入类型。这是我的想法:
在第一个类T中,很容易从IsVisible具有T重载并且T在整个Manager类中都知道的方法中推断出来,没什么大不了的。但在第二种情况下T,它被指定为方法的通用约束,可能更难推断。行。
但这也不起作用:
public static class Util
{
    static void Manage()
    {
        Do(t => IsVisible(t)); //still wiggly line
    }
    static bool IsVisible(Control t)
    {
        return t.Visible;
    }
    static S Do<S, T>(Func<T, S> operation) where T : Control, new()
    {
        return operation(new T());
    }
}
- 为什么编译器 - T在最后一种情况下不推断?
- 更重要的是,最后一个案例与第一个案例有何不同?在第一种情况下,编译器必须从 - IsVisible方法中推断出它,然后一直返回以检查- T包含 的类中的内容,而在最后一种情况下,它在方法- IsVisible中很容易获得。- IsVisible所以我认为第三种情况比第一种更容易。