为什么我丢失了继承类型?

时间:2013-10-30 08:45:08

标签: c# arrays casting

我有基类User ant两个继承的classe - Employee和ExtEmployee。

class User { ... }
class Employee : User { ... }
class ExtEmployee : User { ... }

例如两个方法 - GetUsers()和GetUsers2()。 GetUsers()返回所有用户。 GetUsers2()具有过滤器并从currentOrganization返回用户。

public User[] GetUsers()
{
  Employee[] list1 = GetEmployees();
  ExtEmployee[] list2 = GetExtEmployees(); // empty list

  var list = list1.OfType<User>().Union(list2).ToArray();

  return list;
}

public User[] GetUsers2()
{
  Employee[] list1 = GetEmployees();
  ExtEmployee[] list2 = GetExtEmployees(); // empty list

  var list = list1.OfType<User>().Union(list2).ToArray();

  list = list.Where(u => u.OrganizationId == _currentOrganizationId).ToArray();

  returt list;
}

public void Main()
{
  var employees = GetUsers() as Employee[]; // works fine
  var employees2 = GetUsers2() as Employee[]; // employee2 == null
}

我无法将方法GetUsers2()的结果转换为Employee [] - 我得到null值。为什么呢?

1 个答案:

答案 0 :(得分:1)

在您的示例中,两行应等于null。您无法将User[]数组转换为Employee[]数组。那些是不同的类型。

但是,您可以使用IEnumerable.Cast<T>()IEnumerable.OfType<T>()方法执行转换:

//will remove `ExtEmployee` objects.
var employees2 = GetUsers2().OfType<Employee>().ToArray();
//will throw InvalidCastException on ExtEmployee objects unless you define cast operator
var employees2 = GetUsers2().Cast<Employee>().ToArray();