- на обоих базовых классах. У меня сработало нормально, но вам нужно выполнить следующее приведение, чтобы установить родителя:

ою архитектуру снаследственный родовые и детско-родительские отношения. У меня есть одна большая проблема: я не могу сделать так, чтобы и ребенок, и родитель знали о типе друг друга, только один из двух.

Мне нужно, чтобы и ребенок, и родитель знали о типе друг друга.

Сценарий 1: Parent знает тип потомка, но child знает только родителя-родителя с потомками.

public class Child
{
    public Parent<Child> Parent;
}

public class Parent<TChild>
    where TChild : Child
{
    public List<TChild> Children;
}

Сценарий 2: Child знает родительский тип, но parent знает только общих потомков с родителем.

public class Child<TParent>
    where TParent : Parent
{
    public TParent Parent;
}

public class Parent
{
    public List<Child<Parent>> Children;
}

Сценарий 3Утопический, но недостижимый сценарий

public class Child<TParent>
    where TParent : Parent
{
    public TParent Parent;
}

public class Parent<TChild>
    where TChild : Child
{
    public List<TChild> Children;
}

Конечно, сценарий 3 не будет компилироваться, потому что Parent и Child используют второй универсальный тип, который будетих собственный типа, но я не могу (или, по крайней мере, не знаю, как!) указать, что это их собственный тип.

Я попадаю в какую-то бесконечную петлю / рекурсию / бросок мяча, пожалуйста, помогите мне, прежде чем я утону.

Удачи.

РЕДАКТИРОВАТЬ: Если мне неясно, я могу сослаться на свои типы да, но если пользователь выводит Child в FooChild и обращается к дочерним элементам родителя FooChild, это будут только Child, а не FooChild, как и должно быть.

Пример отказа со сценарием 1:

public class Child
{
    public Parent<Child> Parent;
}

public class Parent<TChild>
    where TChild : Child, new()
{
    public List<TChild> Children;
}

public class FooChild : Child
{
    public int Required;

    public void Bar()
    {
        foreach (Child child in this.Parent.Children)
        {
            int x = child.Required; // cannot be accessed!
        }
    }
}

Пример отказа со сценарием 2:

public class Child<TParent>
    where TParent : Parent
{
    public TParent Parent;
}

public class Parent
{
    public List<Child<Parent>> Children;
}

public class FooChild : Child<Parent>
{
    public int Required;

    public void Bar()
    {
        foreach (Child<Parent> child in this.Parent.Children)
        {
            int x = child.Required; // cannot be accessed!
        }
    }
}

Ответы на вопрос(1)

Ваш ответ на вопрос