C# 为什么可以';我不能将泛型类型的此实例添加到集合中吗?

C# 为什么可以';我不能将泛型类型的此实例添加到集合中吗?,c#,.net,generics,inheritance,C#,.net,Generics,Inheritance,我有两种具有多对多关系的抽象类型: public abstract class Experiment<T> where T : Sample { private List<T> _Samples = new List<T>; public IReadOnlyCollection<T> Samples { get { return _Samples.AsReadOnly(); } } public v

我有两种具有多对多关系的抽象类型:

public abstract class Experiment<T> where T : Sample
{
    private List<T> _Samples = new List<T>;
    public IReadOnlyCollection<T> Samples {
        get { return _Samples.AsReadOnly(); }
    }

    public void AddSample(T sample)
    {
        _Samples.Add(sample); 
        sample.Experiments.Add(this); // The problem lies here
    }
}

public abstract class Sample
{
    private List<Experiment<Sample>> _Experiments = new List<Experiment<Sample>>;
    public ICollection<Experiment<Sample>> Experiments {
        get { return _Experiments; }
    }
}

我的问题是,是否有办法解决这个问题,或者更好地模拟这些实体之间的关系。

因此,我认为解决办法是:

public class Experiment<T> where T : Sample
{
    private List<T> _Samples = new List<T>();
    public IReadOnlyCollection<T> Samples
    {
        get { return _Samples.AsReadOnly(); }
    }

    public Experiment()
    {
    }

    public Experiment(IEnumerable<T> samples)
    {
        _Samples = samples.ToList();
    }

    public void AddSample(T sample)
    {
        _Samples.Add(sample);
        sample.Experiments.Add(new Experiment<Sample>(_Samples)); // The problem lies here
    }
}

public abstract class Sample
{
    private List<Experiment<Sample>> _Experiments = new List<Experiment<Sample>>();
    public ICollection<Experiment<Sample>> Experiments
    {
        get { return _Experiments ; }
    }
}
public abstract class Experiment<T> where T : Sample<T>
{
    private List<T> _Samples;
    public IReadOnlyCollection<T> Samples {
        get { return _Samples.AsReadOnly(); }
    }

    public void AddSample(T sample)
    {
        _Samples.Add(sample); 
        sample.Experiments.Add(this); // The problem lies here
    }
}

public abstract class Sample<T> where T : Sample<T>
{
    private List<Experiment<T>> _Experiments;
    public ICollection<Experiment<T>> Experiments {
        get { return _Experiments; }
    }
}
公共抽象类实验,其中T:Sample
{
私人名单样本;
公共IReadOnlyCollection样本{
获取{return _Samples.AsReadOnly();}
}
公共无效添加样本(T样本)
{
_样本。添加(样本);
sample.Experiments.Add(这个);//问题就在这里
}
}
公共抽象类示例,其中T:Sample
{
私人列表实验;
公共收集实验{
获取{return}
}
}

由于这两种类型相互依赖,因此它们需要共享相同的泛型类型。

因此我认为解决方法如下:

public abstract class Experiment<T> where T : Sample<T>
{
    private List<T> _Samples;
    public IReadOnlyCollection<T> Samples {
        get { return _Samples.AsReadOnly(); }
    }

    public void AddSample(T sample)
    {
        _Samples.Add(sample); 
        sample.Experiments.Add(this); // The problem lies here
    }
}

public abstract class Sample<T> where T : Sample<T>
{
    private List<Experiment<T>> _Experiments;
    public ICollection<Experiment<T>> Experiments {
        get { return _Experiments; }
    }
}
公共抽象类实验,其中T:Sample
{
私人名单样本;
公共IReadOnlyCollection样本{
获取{return _Samples.AsReadOnly();}
}
公共无效添加样本(T样本)
{
_样本。添加(样本);
sample.Experiments.Add(这个);//问题就在这里
}
}
公共抽象类示例,其中T:Sample
{
私人列表实验;
公共收集实验{
获取{return}
}
}


因为这两种类型相互依赖,所以它们需要共享相同的泛型类型。

PS:我实际上使用VB,但似乎有更多的C#用户,这就是我将代码翻译为C#的原因。我相信这种语言不应该对解决问题的方法产生真正的影响,但是如果我弄错了,请随时纠正我。你能分享正在工作的VB代码吗?@CédricBignon实际上没有“正在工作”的VB代码本身,我在与上面评论的代码对应的行中得到一个编译器错误(例如,
sample.Experiments.Add(Me)
)。我在语法上搞砸了吗?@YuriyFaktorovich一个样本可以经历许多不同类型的实验(连续),每个都会向其中添加一些数据。实验必须在一个或多个样本上运行。我发现您的代码中有错误。它看起来像
Sample。实验
应为
ICollection
类型(但这并不能回答您的问题)PS:我实际上使用VB,但似乎有更多的C#用户,这就是我将代码翻译成C#的原因。我相信这种语言不应该对解决问题的方法有什么影响,但如果我错了,请随时纠正我。你能分享工作的VB代码吗?@CédricBignon那里实际上没有“正在使用”VB代码本身,我在与上面评论的代码对应的行(即,
sample.Experiments.Add(Me)
)上得到了一个编译器错误。我是否在语法上搞砸了?@YuriyFaktorovich一个示例可以(连续)进行许多不同类型的实验,每个都会向其中添加一些数据。实验必须在一个或多个样本上运行。我发现您的代码中有错误。它看起来像
Sample。实验
应为
ICollection
类型(但这并不能回答您的问题)
where T:Sample
什么是
Sample
?@HamletHakobyan,它是
Sample
的派生具体类。如果我要构建
ConcreteSample:Sample
,它将满足该条件。此外,OP永远不会传递
Sample
的实例,因为它是抽象的。它需要是
public抽象类示例,其中T:Sample
。否则它将无法编译。@MichaelGunter,非常好的观察。我会编辑,谢谢!@cédricBignon,您不会。当您从
示例继承时,它将需要一个类型(例如
公共类MySample:Sample
)“
其中T:Sample
什么是
Sample
?@HamletHakobyan,它是
Sample
的派生具体类。如果我要构建
具体Sample:Sample
,它将满足该条件。此外,OP永远不会传递
Sample
的实例,因为它是抽象的。它需要是
publil”ic抽象类示例,其中T:Sample
。否则它将无法编译。@MichaelGunter,非常好的观察。我会编辑,谢谢!@CédricBignon,您不会。当您从
示例继承时,它将需要一个类型(例如
公共类MySample:Sample
)。这是可行的,但不幸的是,我没有提到一个实验实例绑定到大量其他数据和硬件控制器类的实例。简单地重新创建一个实验实例将非常昂贵,至少需要大量代码才能成功地移动数据。这是可行的,但不幸的是y我没有提到一个实验的实例绑定到很多其他数据和硬件控制器类的实例。简单地重新创建一个实验实例至少是昂贵的,并且需要更多的代码才能成功地移动数据。
public abstract class Experiment<T> where T : Sample<T>
{
    private List<T> _Samples;
    public IReadOnlyCollection<T> Samples {
        get { return _Samples.AsReadOnly(); }
    }

    public void AddSample(T sample)
    {
        _Samples.Add(sample); 
        sample.Experiments.Add(this); // The problem lies here
    }
}

public abstract class Sample<T> where T : Sample<T>
{
    private List<Experiment<T>> _Experiments;
    public ICollection<Experiment<T>> Experiments {
        get { return _Experiments; }
    }
}