为什么这个泛型类没有选择提供的类型,而泛型方法可以选择
本文关键字:类型 泛型方法 选择 泛型类 有选择 为什么 | 更新日期: 2023-09-27 18:17:06
考虑以下静态泛型方法:
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>
,它将满足所提供的参数。
没关系。必须在构造函数中声明泛型类型。第一个示例调用静态方法,而不是类。你永远不能调用一个类。第二个例子调用类的构造函数。泛型类的实例化需要声明泛型类型。
考虑一下:
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是一个方法,您不必声明该方法的泛型部分。方法可以推断泛型类型。构造函数不能。