以下代码给出了这个错误:
无法从'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将获得有限的协方差和反差异.
这就是协方差的问题,并不像第一眼看上去那么容易.C#4会有一些支持.
为了解问题,想象一下你的情况下这个演员实际上是有效的.现在你有一个List<object>,例如也有一个Add方法.但是,实际的论证Add必须是a Customer,这显然违反了实施; 实现不提供Add(object obj)方法.
不幸的是,一些问题可以通过使用接口的智能(呃)设计来解决,其中协方差可以是通用方法,例如GetEnumerator.
C#(目前)不支持泛型类型的方差.
但是,如果您使用的是C#3.0,则可以执行以下操作:
FillSmartGrid( customers.Cast<object>() );
Run Code Online (Sandbox Code Playgroud)
这是因为类的列表不能转换为基类列表.这是一个刻意决定使语言安全.这个问题经常被问到.
以下是我如何解决这个问题的标准答案:
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#团队首席架构师之一真的很好的解释.
| 归档时间: |
|
| 查看次数: |
19399 次 |
| 最近记录: |