0

考虑以下静态泛型方法:

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>可以满足提供的参数。

4

1 回答 1

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

于 2015-10-11T18:36:23.093 回答