我有一个泛型类,我想创建一个通用列表,其中底层类实现相同的接口。但是,并非所有实现给定的接口。
一个例子比描述问题容易。
internal interface ISomething
{
}
internal class ThisThing : ISomething
{
}
internal class ThatThing : ISomething
{
}
internal class SomethingElse
{
}
internal class GenericThing<T>
{
}
internal class DoThings
{
void Main()
{
var thing1 = new GenericThing<ThisThing>();
var thing2 = new GenericThing<ThatThing>();
var thing3 = new GenericThing<SomethingElse>();
**var thingList = new List<GenericThing<ISomething>>() {thing1, thing2};**
}
}
我无法创建thingList。有没有办法将实现相同接口的两个东西转换为泛型集合,同时仍然保留GenericThing类不受约束到接口。
答案 0 :(得分:4)
如果您使用covariant interface:
,则可以这样做internal interface IGenericThing<out T>
{
}
internal class GenericThing<T> : IGenericThing<T>
{
}
void Main()
{
var thing1 = new GenericThing<ThisThing>();
var thing2 = new GenericThing<ThatThing>();
var thing3 = new GenericThing<SomethingElse>();
var thingList = new List<IGenericThing<ISomething>>() {thing1, thing2};
}
请注意,仅当T
仅用作IGenericThing<T>
中的输出时才可以执行此操作,而不是作为输入! (它在我的例子中没用,也是允许的;虽然,显然,没用)