2

我尝试使用模板方法(foo1)中的方法(foo2),编译器说他不知道属于该类(T)的这个方法(foo2)。

什么是正确的语法,哪个编译器接受它?

private void foo1<T>(T instance)
{
    instance.foo2();
}
4

2 回答 2

8

您应该像下面的代码片段一样对泛型类型创建约束:

private void foo1<T>(T instance) where T : IFoo
{ 
    instance.foo2(); 
}

interface IFoo
{
    void foo2();
}

其中定义,封闭的泛型类型只能从IFoo接口派生。但是你为什么不坚持使用下面给出的非通用版本呢?

private void foo1(IFoo instance) 
{ 
    instance.foo2(); 
}

interface IFoo
{
    void foo2();
}
于 2013-01-06T15:24:18.227 回答
2

您正在使用对泛型类型没有任何约束的泛型方法。

这意味着它可以是任何对象。编译器抱怨是因为大多数对象没有foo2方法。

foo2()如果您希望能够在泛型参数上调用该方法,则需要将泛型类型约束为具有方法的类型。

或者,不要使用泛型,而是传入已foo2定义的抽象类型。

于 2013-01-06T15:22:34.173 回答