c# List<接口>小技巧

不同的情况下需要返回不同类型的数据集合,特点是,这些类型都继承自同一个接口。

public interface IExample
{
    string ID { get; set; }
    string Name { get; set; }
}

public class A : IExample
{
    public string ID { get; set; }
    public string Name { get; set; }
}
public class B : IExample
{
    public string ID { get; set; }
    public string Name { get; set; }
}

public class Test
{
    //方法A
    public List<T> GetRefList<T>(string key) where T : IExample
    {
        if (key == "A") return new List<A>();
        else if (key == "B") return new List<A>();
    }
    //方法B
    public T[] GetRefList<T>(string key) where T : IExample
    {
        if (key == "A") return new A[10];
        else if (key == "B") return new B[10];
    }
    //方法C
    public IExample[] GetRefList(string key)
    {
        if (key == "A") return new A[10];
        else if (key == "B") return new B[10];
        else return null;
    }
    //方法D
    public List<IExample> GetRefList(string key)
    {
        if (key == "A") return new List<A>();
        else if (key == "B") return new List<B>();
        else return null;
    }
}

其中,方法A、B、D编译都不能通过,只有方法C可以编译通过。

 

补充一种情况:

//方法E
public IEnumerable<IExample> GetRefList(string key)
{
    if (key == "A") return new List<A>();
    else if (key == "B") return new B[10];
    else return null;
}

可以编译通过。这样的话,原来存在的问题基本可以解决。

 

这里的List<IParent>和List<SubChild>之间的相互转换涉及到泛型的协变和抗变。

.NET4.0对IEnumerable接口的修改?

2.0中的定义:

    public interface IEnumerable<T> : IEnumerable
    {
        IEnumerator<T> GetEnumerator();
    }

4.0中的定义:

    public interface IEnumerable<out T> : IEnumerable
    {
        IEnumerator<T> GetEnumerator();
    }

可以看到4.0中增加了对协变的支持。

可以在两个版本试下, 下面的语句在2.0下会报错。

    List<SubClass> subarr = new List<SubClass>();
    IEnumerable<IParent> parentarr = subarr;

这里参考资料:http://www.cnblogs.com/tenghoo/archive/2012/12/04/interface_covariant_contravariant.html

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值