为什么这个泛型类没有采用泛型方法所提供的类型呢?

时间:2015-10-11 18:30:26

标签: c# generics nested-generics

考虑以下静态通用方法:

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>会对提供的参数感到满意。

1 个答案:

答案 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是一种方法,您不必声明方法的通用部分。方法可以推导出泛型类型。构造者不能。