zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    值传递和引用传递(不是引用类型的传递)的区别
    字符串一旦定义,就表示开辟好了指定的空间,其内容就不可改变
    String类的直接赋值和构造方法赋值的区别
    字符串常量是String类的匿名对象
    Integer和int的区别(转)
    final的好处
    数组引用传递
    构造代码块
    ==和equals()的不同点
    Redis数据类型底层实现
  • 原文地址:https://www.cnblogs.com/icyJ/p/3120577.html
Copyright © 2011-2022 走看看