好吧,我一定是把标题弄错了。更多的代码,更少的文字:
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
所以我认为第三种情况比第一种更容易。