Почему открытые общие типы нельзя передавать в качестве параметров. У меня часто есть такие классы, как:
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;} }
}
Это много церемоний для того, что, как я думал, мог сделать компилятор. Даже если что-то нельзя изменить, я нахожу психологически очень полезным, если я знаю причины/оправдания отсутствия сокращений синтаксиса.