c# - 从 List<T> 继承的类型不能分配给 List<T>

标签 c# class generics inheritance

例子:

        public class ListInheritanceTest
        {
            public void Test1()
            {
                List<string> list = new List<string>();
                MyList myList = list;
            }
        }
        public class MyList : List<string>
        {
        }

但是MyList myList = list有错误“无法将类型‘System.Collections.Generic.List’隐式转换为‘ConsoleTest.MyList’”

我该如何解决这个问题?谢谢。

----编辑----
我不是在问为什么会报错。我想知道使分配工作的解决方法是什么。 上面的代码只是一个简化的例子。目的是转换所有List<SomeType>到我的代码中的 MyList 而不会引入任何向后不兼容。

--- 第二次编辑 ----

让我改一下问题。假设我在上面的代码中以相同的方式定义了 MyList。 分配 List<string> 的最简单方法是什么?到我的列表。

我知道

            foreach(var item in list)  
            mylist.Add(item)  

总是工作。只是在寻找更优雅的东西。

最佳答案

How can I fix this?

改变你的设计。你不能沮丧 - a MyList List<string>但反之则不然。您可以通过重新使用 List<T> 将项目复制到新列表中接受任何 IEnumerable<T> 的复制构造函数(其中包括一个 List<string> ):

public class ListInheritanceTest
{
    public void Test1()
    {
        List<string> list = new List<string>();
        MyList myList = new MyList(list);  // copy the items in the list
    }
}
public class MyList : List<string>
{
   public MyList(IEnumerable<string> list) : base(list) {}  // reuse the List<T> copy constructor
}

The purpose is to convert all List to MyList in the code without introducing any backward incompatibility.

同样,你不能。 List不是 MyList .您能做的最好的事情就是转换 List 为MyList通过使用复制构造函数或其他一些方法。

What's the easiest way to assign a List<string> to MyList.

不能List<string> 不一定 MyList .以与 Cat 相同的方式不是 Tiger .可能是,但您不能只是类型转换 is 并将其视为它。

请注意,如果您创建列表为 MyList (例如 List<T> newList = new MyList() )然后你可以安全地转换它。事实上,您可以在其他任何地方使用它,就好像它是一个 List<string> (因为它是!)但是你不能安全地转换任意 List<string>MyList .期间。

关于c# - 从 List<T> 继承的类型不能分配给 List<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18004950/

相关文章:

java - Java 中菱形运算符 (<>) 的作用是什么?

c# - 在 Visual Studio 中时 AllocConsole 不打印

c# - 如何确保 Task.Factory.StartNew 不会减慢主线程的速度?

java - (字符);这段代码的目的是什么?

python - 拆分一个太大的类

java - 如何在Java中通过多个字段过滤对象列表?

c# - 检查USB设备是否连接

c# - 带秒的时间选择器

c++ - 类析构函数导致重载+运算符的问题

.net - 使用 CType Int32?到 Int64? - System.InvalidCastException : Specified cast is not valid