0

次の静的ジェネリック メソッドを検討してください。

public class Foo
{
    public static void Test<T>(T arg)
    where T : FrameworkElement
    {
    }
}

以下のように簡単に呼び出すことができ、T はButton渡された引数の a であることが暗示されます。

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

それで大丈夫です。コンストラクターでは常にジェネリック型を宣言する必要があります。最初の例は、クラスではなく静的メソッドを呼び出します。クラスを呼び出すことはできません。2 番目の例では、クラスのコンストラクターを呼び出します。ジェネリック クラスのインスタンス化には、ジェネリック型の宣言が必要です。

このことを考慮:

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 に答える