为什么我不能将List <Customer>作为参数传递给接受List <object>的方法?

Edw*_*uay 12 c# generics

以下代码给出了这个错误:

无法从'System.Collections.Generic.List'转换为'System.Collections.Generic.List'.

如何向编译器指出Customer确实从对象继承?或者它只是不与泛型集合对象继承(发送List<string>获取相同的错误).

using System.Collections.Generic;
using System.Windows;
using System.Windows.Documents;

namespace TestControl3423
{
    public partial class Window2 : Window
    {
        public Window2()
        {
            InitializeComponent();

            List<Customer> customers = Customer.GetCustomers();
            FillSmartGrid(customers);

            //List<CorporateCustomer> corporateCustomers = CorporateCustomer.GetCorporateCustomers();
            //FillSmartGrid(corporateCustomers);
        }


        public void FillSmartGrid(List<object> items)
        {
            //do reflection on items and display dynamically
        }
    }

    public class Customer
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Street { get; set; }
        public string Location { get; set; }
        public string ZipCode { get; set; }

        public static List<Customer> GetCustomers()
        {
            List<Customer> customers = new List<Customer>();
            customers.Add(new Customer { FirstName = "Jim", LastName = "Jones", ZipCode = "23434" });
            customers.Add(new Customer { FirstName = "Joe", LastName = "Adams", ZipCode = "12312" });
            customers.Add(new Customer { FirstName = "Jake", LastName = "Johnson", ZipCode = "23111" });
            customers.Add(new Customer { FirstName = "Angie", LastName = "Reckar", ZipCode = "54343" });
            customers.Add(new Customer { FirstName = "Jean", LastName = "Anderson", ZipCode = "16623" });
            return customers;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ann 14

.NET没有协方差和反差(尚未).

B来自A并不意味着List<B>源于List<A>.它没有.它们是两种完全不同的类型.

.NET 4.0将获得有限的协方差和反差异.

  • @Mark是正确的.添加到C#的协方差支持仅限于接口和委托.List <T>是具体类型,不能在这里利用 (3认同)
  • 列表没有协方差,因为它既不是"in"也不是"out" (3认同)

Luc*_*ero 8

这就是协方差的问题,并不像第一眼看上去那么容易.C#4会有一些支持.

为了解问题,想象一下你的情况下这个演员实际上是有效的.现在你有一个List<object>,例如也有一个Add方法.但是,实际的论证Add必须是a Customer,这显然违反了实施; 实现不提供Add(object obj)方法.

不幸的是,一些问题可以通过使用接口的智能(呃)设计来解决,其中协方差可以是通用方法,例如GetEnumerator.


Win*_*ith 7

C#(目前)不支持泛型类型的方差.

但是,如果您使用的是C#3.0,则可以执行以下操作:

FillSmartGrid( customers.Cast<object>() );
Run Code Online (Sandbox Code Playgroud)


Mar*_*ers 6

这是因为类的列表不能转换为基类列表.这是一个刻意决定使语言安全.这个问题经常被问到.

以下是我如何解决这个问题的标准答案:

List<A> listOfA = new List<C>().ConvertAll(x => (A)x);
Run Code Online (Sandbox Code Playgroud)

要么:

List<A> listOfA = new List<C>().Cast<A>().ToList();
Run Code Online (Sandbox Code Playgroud)

另外这里是埃里克利珀自己,在C#团队首席架构师之一真的很好的解释.