很抱歉询问看起来很明显的问题。
我有一个类型为T的“适配器”泛型类,其中T是一个已定义的接口。我想在该类中创建一个方法,该方法采用不同类型的通用适配器。
public interface ICommon { }
public class TypeOne : ICommon { }
public class TypeTwo : ICommon { }
public class Adapter<T> where T : ICommon
{
void TakeAnotherType(Adapter<S> other)
{ }
}
这给了我一个编译错误Cannot resolve symbol 'S'
。
我希望能够做到;
MyOne one = new Adapter<TypeOne>();
MyTwo two = new Adapter<TypeTwo>();
one.TakeAnotherType(two);
如果我更改方法以取Adapter<T>
,则会抱怨“两个”不是Adapter<TypeOne>
类型
答案 0 :(得分:8)
void TakeAnotherType<S>(Adapter<S> other) where S:ICommon
{ }
由于T
的通用类型Adapter
被限制为ICommon
,因此以同样的方式约束S
也很重要,因为它被用作通用Adapter<T>
的类型,因此它还必须满足ICommon
约束。
答案 1 :(得分:2)
只需更改
void TakeAnotherType(Adapter<S> other)
到
void TakeAnotherType<S>(Adapter<S> other) where S : ICommon
它应该有用。
答案 2 :(得分:1)
一旦指定了一个类是通用的(通过命名它Something<T>
),其中的每个方法都在该类型T
上是隐式通用的。要说一个方法在不同的类型上是通用的,你必须通过调用它来SomeMethod<U>
在方法名称中指定该事实。然后,此方法的主体可以访问这两种类型T
(类是通用的类型)和U
(方法的类) 是通用的。)
另请注意,类型参数的两个常用约定是T
,U
,V
等;或TSomething
,TSomethingElse
,TEvenMore
。我不认为我曾经见过S
使用过......