わかりました、タイトルをひどく間違えたに違いありません。より多くのコード、より少ない言葉:
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
から簡単に推測できました。大したことではありません。しかし、2 番目のケースでは、メソッドの一般的な制約として指定されているため、推測するのが難しい場合があります。Ok。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
何があるかを確認する必要があります。したがって、3 番目のケースは最初のケースよりも簡単だと思います。T
IsVisible
IsVisible