-1

基本クラス User ant 2 継承クラス - Employee と ExtEmployee があります。

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

たとえば、GetUsers() と GetUsers2() の 2 つのメソッドがあります。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 値を取得します。なんで?

4

1 に答える 1

1

あなたの例では、両方の行が に等しくなければなりませんnullUser[]配列を配列にキャストすることはできません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();
于 2013-10-30T09:11:08.750 に答える