Здесь я имею дело с дженериками, но у меня есть странная ситуация, когда я пытаюсь присвоить экземпляр класса универсальному свойству.
class Context<A,T> where A: Answer<T>
{
void SomeMethod()
{
A answer; // suppose it have a value;
answer.context=this; // produce CS00029 error
}
}
class Answer<T>
{
Context<Answer<T>,T> context {get;set;}
}
Здесь недостаточно информации, чтобы ответить на ваш вопрос, также это довольно вложенный общий дизайн и довольно подозрительный
Утверждение «where A : Answer<T>» говорит «когда A происходит от Answer<T>» не гарантирует, что они одного типа.
@Генерал, я согласен. Это похоже на чрезмерное использование дженериков.
Новички часто начинают двигаться в неправильном направлении с дженериками. Они не знают, какова их модель данных, поэтому они делают ее общей и предполагают, что смогут выбрать конкретные классы позже. Это неправильно и контрпродуктивно. С дженериками начинать сложнее, потому что вам нужно заранее знать каждую модель. Вместо этого создавайте свой класс только для одной модели, например Answer
, только после того, как у вас будет эта работа, вы должны обобщить ее для работы с большим количеством классов.
@YeldarKurmangaliyev да, я имею в виду ошибку компиляции CS00029.
Сценарий заключается в том, что у меня есть родитель, у которого есть дети, поэтому я хочу, чтобы родитель ввел себя в дочерний элемент, чтобы дочерний элемент мог уведомить родителя о чем-то (например, когда он выбран). это упрощенная версия исходного кода, это скрипт в Unity, поэтому есть много других ограничений, но здесь я привожу часть проблемы на чистом C#. так что, если есть какие-либо предложения, я буду поляна. например, как вы вводите родительский экземпляр (контекст) в дочерний (ответ) в моей ситуации?
Вместо описание вашего сценария, не могли бы вы показывать свой сценарий? Отредактируйте вопрос и добавьте более реалистичный пример.
Кому интересно, я нашел решение от кого-то за пределами этого сайта, и это его предложение:
public class Context<A, T>: IContext<A, T> where A : Answer<T>
{
void SomeMethod()
{
A answer = Activator.CreateInstance<A>();
answer.context = this;
}
}
public class Answer<T>
{
public IContext<Answer<T>, T> context { get; set; }
}
public interface IContext<out A, T> {}
вы должны принять свой ответ, так как это решает вашу проблему, также не стесняйтесь давать ссылку на внешний источник для этого решения.
@SamuelVidal Я думал, что принял свой ответ, не так ли?
ах, извините, я заметил это сейчас, это был простой щелчок :)
Что особенно странного в этой ситуации? Вы имеете в виду ошибку компиляции CS00029? Не могли бы вы показать сообщение об ошибке?