转换泛型类型C#

跑22

我希望有一个接口,该接口可以保留通用类型类的对象。以下是一些代码和更多说明:

    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>();
    }
}

问题是,Class2将作为继承类的基础,我只知道,字段_item将保持实现某种通用接口的类的对象(接口从IEnumerable继承,因此必须是通用的),我不知道我如何强制字段项目接受实现此接口的类的对象(而它们的通用类型可以是Item1,Item2等,但是它们都实现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>();
    }
}

你需要了解的是,即使Apple继承(实现),IFruit那么ICollectionOfFruit<Apple>不继承ICollectionOfFruit<IFruit>

如果ICollectionOfFruit<T>继承,IList<T>则强制转换BoxOfFruit<Apple>ICollectionOfFruit<IFruit>将允许您向Banana集合添加一个那会在运行时爆炸。

但是,在您的情况下,ICollectionOfFruit<T>继承自,IEnumerable<T>因此您可以进行一个简单的更改以使代码正常工作:

public interface ICollectionOfFruit<out T> : IEnumerable<T> { }

由于out它意味着您将永远不会尝试将其放入in收藏夹IFruit,因此允许强制转换是安全的。

但是,如果您的实际用例允许ICollectionOfFruit<T>将aT作为方法的输入,则不能使用out

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C#中的泛型类型转换

来自分类Dev

C#:从泛型转换为值类型

来自分类Dev

在C#中强制转换为任何类型的泛型

来自分类Dev

在 C# 中安全地转换泛型类型

来自分类Dev

C#强制转换泛型类型(如C ++用户定义的转换)

来自分类Dev

泛型类型的转换

来自分类Dev

转换泛型类型

来自分类Dev

c#泛型无法将源类型转换为目标类型

来自分类Dev

C#集合类型约束泛型

来自分类Dev

声明C#泛型类型方法

来自分类Dev

C#中泛型类型的缺点

来自分类Dev

C#中的泛型类型

来自分类Dev

comman的C#泛型类型推断

来自分类Dev

在C#中循环泛型类型

来自分类Dev

C#中的双重泛型类型

来自分类Dev

可比类型的C#泛型

来自分类Dev

C#派生泛型类型参数

来自分类Dev

C# 在泛型上转换错误

来自分类Dev

如何使用C#泛型将类的对象转换为T类型的对象?

来自分类Dev

C#中的泛型继承:无法将类型“ MyWidget”隐式转换为“ IWidget”

来自分类Dev

C#泛型之间是否有任何类型转换的规则?

来自分类Dev

C#如何在泛型类型实现某些类时强制转换类

来自分类Dev

如何使用C#泛型将类的对象转换为T类型的对象?

来自分类Dev

C# 尝试返回泛型列表“不能隐式转换类型”

来自分类Dev

我可以在 C# 中将泛型类型转换为 Dictionary<,> 吗?

来自分类Dev

如何在C#中将具有泛型类型的类转换为具有作为泛型类型的对象的类

来自分类Dev

Swift泛型类型转换

来自分类Dev

泛型无法转换类型

来自分类Dev

Java泛型类型转换