c# Почему открытые универсальные типы нельзя передавать в качестве параметров?

Почему открытые общие типы нельзя передавать в качестве параметров. У меня часто есть такие классы, как:

public class Example<T> where T: BaseClass
{
   public int a {get; set;}
   public List<T> mylist {get; set;}
}

Допустим, BaseClass выглядит следующим образом;

public BaseClass
{
    public int num;
}

Затем мне нужен метод say:

public int MyArbitarySumMethod(Example example)//This won't compile Example not closed
{
   int sum = 0;
   foreach(BaseClass i in example.myList)//myList being infered as an IEnumerable
       sum += i.num;
   sum = sum * example.a;
   return sum;
}

Затем я должен написать интерфейс только для передачи этого одного класса в качестве параметра следующим образом:

public interface IExample
{
public int a {get; set;}
public IEnumerable<BaseClass> myIEnum {get;}
}

Затем общий класс должен быть изменен на:

public class Example<T>: IExample where T: BaseClass
{
   public int a {get; set;}
   public List<T> mylist {get; set;}
   public IEnumerable<BaseClass> myIEnum {get {return myList;} }
}

Это много церемоний для того, что, как я думал, мог сделать компилятор. Даже если что-то нельзя изменить, я нахожу психологически очень полезным, если я знаю причины/оправдания отсутствия сокращений синтаксиса.

5
задан Rich Oliver 20 March 2012 в 23:25
поделиться