gpt4 book ai didi

c# - 没有使用泛型的显式叶节点类的父子数据结构

转载 作者:太空宇宙 更新时间:2023-11-03 16:45:00 24 4
gpt4 key购买 nike

我有以下示例关系:

namespace Yesod
{
public class Program
{
//
//
//
public struct Particle
{
public byte type;
}

//
//
//
public class Entity<T>
{
public Entity<Entity<T>> Parent
{ get; private set; }

//
//
//
public Entity(Entity<Entity<T>> parent)
{
this.Parent = parent;
}
}

//
//
//
public sealed class Atom : Entity<Particle>
{
public Atom(Entity<Atom> parent)
: base(parent) // Compile Error.
{ }
}

//
//
//
public sealed class Molecule : Entity<Atom>
{
public Molecule()
: base(null)
{ }
}

static void Main(string[] args)
{

}
}
}

我将如何解决上面产生的以下编译错误?

  Argument 1: cannot convert from 'Yesod.Program.Entity<Yesod.Program.Atom>' to 'Yesod.Program.Entity<Yesod.Program.Entity<Yesod.Program.Particle>>'

评论回复#1:具体来说,代码试图分配一个类型的对象

Entity<Atom>

一个类型的对象

Entity<Entity<Particle>>

Atom 实现为

public sealed class Atom : Entity<Particle>

据此

Entity<Atom>

预计会分解成

Entity<Entity<Particle>>

最佳答案

我不懂 C#,但 Java 程序员偶尔也会猛烈抨击这个问题。

环顾其他 C# 源代码,我认为你可以做你想做的事(类型安全性稍有损失):

    public class Entity<T>
{
public Entity<P> Parent
where P : Entity<Entity<T>>
{ get; private set; }

//
//
//
public Entity(Entity<P> parent)
where P : Entity<Entity<T>>
{
this.Parent = parent;
}
}

Java 答案将涉及 ? extends Entity<T> .基本问题是虽然Molecule是一个 Entity<Atom> ,编译器无法知道 Molecule也是一个 Entity<Entity<Particle>> .毕竟,假设 Entity维护一个 child 的列表,并有明智的addChild(T child)方法就可以了。然后编译器会希望确保您只添加了 Atom作为分子的 child 。但是如果 Molecule是一个 Entity<Entity<Particle>> ,那么没有什么能阻止你做:

Entity<Entity<Particle>> downcast = myMolecule;
downcast.addChild(myNonAtomParticleBasedEntity);

此模式的正确的完全类型安全解决方案涉及 self 类型,Java 和 C# 没有。 Foo<F extends Foo<F>>的Java模式( and its C# equivalent ) 接近,但使用起来很滑。否则,声明时间差异将使该模式更清晰。

关于c# - 没有使用泛型的显式叶节点类的父子数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6331242/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com