0

以下のコードでコンパイル エラーが発生するのはなぜですか? C# 4.0 Covariance によると、このような変換は許可されません。リスト employeeList = managerList;

class Program
    {
        static void Main(string[] args)
        {
            List<Manager> managerList = new List<Manager>()
            {
                new Manager{ FirstName="ASFD", LastName="DSS", NoOfReportees=4},
                new Manager{ FirstName="rrr", LastName="dsasde", NoOfReportees=22}
            };
            List<Employee> employeeList = managerList;
        }
    }
    public class Employee
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }
    public class Manager:Employee
    {
        public int NoOfReportees { get; set; }
    }
4

4 に答える 4

4

どちらでもないListIList共変です。

代わりにこれを試してください:

IEnumerable<Employee> employeeList = managerList

MSDN の詳細:共分散と反分散 (C# および Visual Basic)

于 2013-06-30T07:18:52.150 に答える
0

List<T>不変です。が必要IEnumerable<T>ですcovariant

Eric Lippertによる説明を参照してください。動物園の類推で非常にうまく説明されています -

トカゲを動物のリストに入れることができるため、 をList<Mammal>に変換することはできません。リストにすでにトラが含まれている可能性があるため、 a を a に変換することはできませんList<Animal>List<Mammal>List<Giraffe>

したがってList<T>、T で不変でなければなりません。

ただし、トカゲを追加するメソッドがないため (C# 4.0 以降) にList<Mammal>変換できます。は T で共変です。IEnumerable<Animal>IEnumerable<Animal>IEnumerable<T>

于 2013-06-30T07:35:01.483 に答える