Мне интересно, почему я не могу иметь родовое свойство в неродовом классе так же, как я могу иметь родовые методы. Т.е.:
public interface TestClass
{
IEnumerable GetAllBy(); //this works
IEnumerable All { get; } //this does not work
}
Я прочитал ответ @Jon Skeet answer, но это просто утверждение, которое, скорее всего, есть где-то в спецификациях.
Мой вопрос в том, почему на самом деле это так? Можно ли избежать проблем с помощью этого ограничения?
Это Generic Properties сообщение в блоге от Джулиана Бакнолла является довольно хорошим объяснением. По сути, это проблема выделения кучи.
Я думаю, что не использование автоматического метода получения / установки показывает, почему это невозможно без определения «Т» на уровне класса.
Попробуйте написать код, естественным будет следующее:
IEnumerable<T> _all;
IEnumerable<T> All
{
get { return _all; }
}
Поскольку ваше поле использует «T», то «T» должно быть в классе, а CLR знает, что такое «T». есть.
Когда вы используете метод, вы можете отложить определение «T» до тех пор, пока не вызовете метод. Но с полем / свойством, «T» должен быть объявлен в одном месте, на уровне класса.
Как только вы объявляете T в классе, создание свойства становится довольно простым.
public class TestClass<T>
{
IEnumerable<T> All { get; }
}
использование:
var myTestClass = new TestClass<string>();
var stuff = myTestClass.All;
И точно так же, как параметр типа «T» в методе, вы можете подождать, пока вы фактически создадите экземпляр класса TestClass, чтобы определить, каким будет «T» .