C# 铸造泛型C型#

C# 铸造泛型C型#,c#,generics,C#,Generics,我希望有一个接口,它允许我保留泛型类型类的对象。 下面是一些代码和更多解释: public interface IItem { } public interface IClass1<T> : IEnumerable<T> { } public class Item1 : IItem { } public class Item2 : IItem { } public class Class1<T> : IClass1<T> where T :

我希望有一个接口,它允许我保留泛型类型类的对象。 下面是一些代码和更多解释:

    public interface IItem { }
public interface IClass1<T> : IEnumerable<T> { }
public class Item1 : IItem { }
public class Item2 : IItem { }
public class Class1<T> : IClass1<T> where T : class, IItem { }
public class Class2<T> : IClass1<T> where T : class, IItem { }
public class Class : UserControl
{
    IClass1<IItem> _item;
    public virtual IClass1<IItem> item
    {
    get
        {
            return _item;
        }
    set
        {
            _item = value;
            //then do something...
        }
    }
    public Class2()
    {
        //few examples what I would like to do
        item = new Class1<Item1>();
        item = new Class1<Item2>();
        item = new Class2<Item1>();
        item = new Class2<Item2>();
    }
}
公共接口IItem{}
公共接口IClass1:IEnumerable{}
公共类项1:IItem{}
公共类项2:IItem{}
公共类Class1:IClass1,其中T:class,IItem{}
公共类Class2:IClass1,其中T:class,IItem{}
公共类:UserControl
{
IClass1_项目;
公共虚拟IClass1项目
{
得到
{
退货项目;
}
设置
{
_项目=价值;
//然后做点什么。。。
}
}
公共类别2()
{
//我想做的例子很少
项目=新类别1();
项目=新类别1();
item=newclass2();
item=newclass2();
}
}

问题是类2将作为继承类的基础,我只知道,字段_项将保留实现某种通用接口的类的对象(接口从IEnumerable继承,因此它必须是通用的)我不知道如何强制字段项接受实现此接口的类的对象(虽然它们的泛型类型可以是Item1、Item2等,但它们的all implements IItem接口)

以下是重新定义为更易于理解的类:

public interface IFruit { }
public interface ICollectionOfFruit<T> : IEnumerable<T> { }
public class Apple : IFruit { }
public class Banana : IFruit { }
public class BoxOfFruit<T> : ICollectionOfFruit<T> where T : class, IFruit { public IEnumerator<T> GetEnumerator() { throw new NotImplementedException(); } IEnumerator IEnumerable.GetEnumerator() { throw new NotImplementedException(); } }
public class BagOfFruit<T> : ICollectionOfFruit<T> where T : class, IFruit { public IEnumerator<T> GetEnumerator() { throw new NotImplementedException(); } IEnumerator IEnumerable.GetEnumerator() { throw new NotImplementedException(); } }
public class Class
{
    ICollectionOfFruit<IFruit> _item;

    public Class()
    {
        //few examples what I would like to do
        _item = new BoxOfFruit<Apple>();
        _item = new BoxOfFruit<Banana>();
        _item = new BagOfFruit<Apple>();
        _item = new BagOfFruit<Banana>();
    }
}
由于
out
这意味着您永远不会尝试将
in
放入您的收藏
IFruit
,因此允许施放是安全的


然而,如果您的实际用例允许
icollectionofruit
T
作为方法的输入,那么您不能使用
out

您的实际问题是什么?你发布的代码与你希望它做的有什么不同?你到底有什么问题?这不是你真正的代码。您的
类有一个名为
Class2
的构造函数。请尽量使这段代码更准确,请重命名这些类,以便更清楚地了解您在做什么。试着给它们命名,比如
IFruit
Apple
Banana
等等,这样我们就能更清楚地知道发生了什么。调用接口
IClass1
令人困惑。让一个名为
Class2
的类实现一个接口
IClass1
,只会让我们的工作变得不必要的困难。
public interface ICollectionOfFruit<out T> : IEnumerable<T> { }