Почему C# не разрешает общие свойства?

Мне интересно, почему я не могу иметь родовое свойство в неродовом классе так же, как я могу иметь родовые методы. Т.е.:

public interface TestClass
{
   IEnumerable GetAllBy(); //this works

   IEnumerable All { get; } //this does not work
}

Я прочитал ответ @Jon Skeet answer, но это просто утверждение, которое, скорее всего, есть где-то в спецификациях.

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

27
задан Community 23 May 2017 в 10:30
поделиться

2 ответа

Это Generic Properties сообщение в блоге от Джулиана Бакнолла является довольно хорошим объяснением. По сути, это проблема выделения кучи.

11
ответ дан 28 November 2019 в 05:46
поделиться

Я думаю, что не использование автоматического метода получения / установки показывает, почему это невозможно без определения «Т» на уровне класса.

Попробуйте написать код, естественным будет следующее:

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» .

0
ответ дан 28 November 2019 в 05:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: