Как присвоить ссылочное значение общему свойству

Здесь я имею дело с дженериками, но у меня есть странная ситуация, когда я пытаюсь присвоить экземпляр класса универсальному свойству.

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;}
}

Что особенно странного в этой ситуации? Вы имеете в виду ошибку компиляции CS00029? Не могли бы вы показать сообщение об ошибке?

Yeldar Kurmangaliyev 29.05.2019 01:39

Здесь недостаточно информации, чтобы ответить на ваш вопрос, также это довольно вложенный общий дизайн и довольно подозрительный

TheGeneral 29.05.2019 02:12

Утверждение «where A : Answer<T>» говорит «когда A происходит от Answer<T>» не гарантирует, что они одного типа.

Thoryn Hawley 29.05.2019 02:14

@Генерал, я согласен. Это похоже на чрезмерное использование дженериков.

Thoryn Hawley 29.05.2019 02:15

Новички часто начинают двигаться в неправильном направлении с дженериками. Они не знают, какова их модель данных, поэтому они делают ее общей и предполагают, что смогут выбрать конкретные классы позже. Это неправильно и контрпродуктивно. С дженериками начинать сложнее, потому что вам нужно заранее знать каждую модель. Вместо этого создавайте свой класс только для одной модели, например Answer, только после того, как у вас будет эта работа, вы должны обобщить ее для работы с большим количеством классов.

Dour High Arch 29.05.2019 02:51

@YeldarKurmangaliyev да, я имею в виду ошибку компиляции CS00029.

Ahmad El Kerdi 29.05.2019 14:13

Сценарий заключается в том, что у меня есть родитель, у которого есть дети, поэтому я хочу, чтобы родитель ввел себя в дочерний элемент, чтобы дочерний элемент мог уведомить родителя о чем-то (например, когда он выбран). это упрощенная версия исходного кода, это скрипт в Unity, поэтому есть много других ограничений, но здесь я привожу часть проблемы на чистом C#. так что, если есть какие-либо предложения, я буду поляна. например, как вы вводите родительский экземпляр (контекст) в дочерний (ответ) в моей ситуации?

Ahmad El Kerdi 29.05.2019 14:17

Вместо описание вашего сценария, не могли бы вы показывать свой сценарий? Отредактируйте вопрос и добавьте более реалистичный пример.

Lasse V. Karlsen 29.05.2019 22:43
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
8
91
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Кому интересно, я нашел решение от кого-то за пределами этого сайта, и это его предложение:

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> {}

Ссылка на решение

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

Samuel Vidal 04.06.2019 22:42

@SamuelVidal Я думал, что принял свой ответ, не так ли?

Ahmad El Kerdi 08.06.2019 20:12

ах, извините, я заметил это сейчас, это был простой щелчок :)

Ahmad El Kerdi 09.06.2019 21:02

Другие вопросы по теме