public interface IInterface1{}
public class Class1 : IInterface1{}为什么IList<Class1>不能隐式转换为IList<IInterface1>?逻辑上似乎可行啊谢谢

解决方案 »

  1.   

    IList <IInterface1> ls=new IList<Class1>();
      

  2.   

    IList <IInterface1> ls=new IList <Class1>(); 要将Class1转换成IInterface1需要强制转换IInterface1 obj=(IInterface1)Class1Obj;
      

  3.   

    这个知道就是感觉比较麻烦为啥不能隐式转换呢?IInterface1 obj=(IInterface1)Class1Obj;这个就不需要显式转换了吧
      

  4.   


    简单地说
    IList <Class1> 与 IList <IInterface1> 没有任何关系
    别说隐式了
    显示也转换不了啊
      

  5.   

    这个问题问的本身就不对!C# 不支持泛型类型的变化。参见:泛型类型中的变化(C# 编程指南)遗憾的是强类型集合有自身的缺陷。例如,假设您有一个强类型 List<object>,您想将 List<int> 中的所有元素追加到 List<object> 中。
    您可能希望能够如下面的示例一样编写代码:List<int> ints = new List<int>();
    ints.Add(1);
    ints.Add(10);
    ints.Add(42);
    List<object> objects = new List<object>();// doesnt compile ints is not a IEnumerable<object>
    //objects.AddRange(ints); 在这种情况下,您希望能够将 List<int>(它同时也是 IEnumerable<int>)作为 IEnumerable<object> 处理。这样做看起来似乎很合理,因为 int 可以转换为对象。这与能够将 string[] 当作 object[](现在您就可以这样做)非常相似。如果您正面临这种情况,那么您需要一种称为泛型变化的功能,它将泛型类型的一种实例化(在本例中为 IEnumerable<int>)当成该类型的另一种实例化(在本例中为 IEnumerable<object>)。由于 C# 不支持泛型类型的变化,所以当遇到这种情况时,您需要尝试几种可能的方法来解决此问题。对于最简单的情况,例如上例中的单个方法 AddRange,您可以声明一个简单的帮助器方法来为您执行转换。例如,您可以编写如下方法:
    // Simple workaround for single method
    // Variance in one direction only
    public static void Add<S, D>(List<S> source, List<D> destination)
        where S : D
    {
        foreach (S sourceElement in source)
        {
            destination.Add(sourceElement);
        }
    }它使您能够完成以下操作:// does compile
    VarianceWorkaround.Add<int, object>(ints, objects);
    遗憾!
      

  6.   


    public interface IInterface
        {
            string Name { get; set; }
        }
        public class ClassA : IInterface
        {
            #region IInterface Members        public string Name
            {
                get;
                set;
            }        #endregion
        }
     static void Main(string[] args)
            {                    
                IList<ClassA> classes=new List<ClassA>();
                classes.Add(new ClassA(){Name="Abc"});
                IList<IInterface> tmp = classes.Cast<IInterface>().ToList();
                List<ClassA> converted=tmp.Cast<ClassA>().ToList();
                converted.ForEach(t => Console.WriteLine(t.Name));
                Console.Read();
            }