为什么这个泛型类没有选择提供的类型,而泛型方法可以选择

本文关键字:类型 泛型方法 选择 泛型类 有选择 为什么 | 更新日期: 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是一个方法,您不必声明该方法的泛型部分。方法可以推断泛型类型。构造函数不能。