考虑以下静态通用方法:
public class Foo
{
public static void Test<T>(T arg)
where T : FrameworkElement
{
}
}
我可以像下面这样简单地调用它,并且T将被隐含为来自传入参数的Button
:
var myButton = new Button();
Foo.Test(myButton);
但是,对于以下通用类......
public class Laa<T>
where T : FrameworkElement
{
public Laa(T element)
{
}
}
此代码无法编译。
var myButton = new Button();
var laa = new Laa(myButton);
相反,我必须明确提供类似的类型。
var myButton = new Button();
var laa = new Laa<Button>(myButton);
我认为T
会从提供的参数中隐含,但似乎并非如此。
我怀疑原因是因为没有班级Laa
- 班级实际上是Laa<Button>
- 因此它不知道要构建什么,但这只是猜测。
即便如此,编译器是否有足够的信息来解决这个问题?没有类Laa
但是有一个通用的Laa<T>
会对提供的参数感到满意。
答案 0 :(得分:0)
没关系。您始终必须在构造函数中声明泛型类型。第一个示例调用静态方法,而不是类。你永远不能打电话给班级。第二个示例调用类的构造函数。泛型类的实例化需要泛型类型声明。
考虑一下:
public class Laa<T>
where T : FrameworkElement
{
public Laa(T element)
{
}
public void Foo<U>(U element)
{
}
}
var x = new Laa<Button>(button);
x.Foo(button);
在这种情况下,Foo是一种方法,您不必声明方法的通用部分。方法可以推导出泛型类型。构造者不能。