Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将子类转换为继承的类_C#_Visual Studio_Visual Studio 2008_Inheritance - Fatal编程技术网

C# 将子类转换为继承的类

C# 将子类转换为继承的类,c#,visual-studio,visual-studio-2008,inheritance,C#,Visual Studio,Visual Studio 2008,Inheritance,我有一个C#.NET2.0项目a(类库),它有一个使用树对象的表单(TreeForm) 我有一个项目B,它有一个继承树的类Oak。Oak类向树添加了一些属性 class Oak : ProjectA.Tree { public string LeafColor; } 类库中的TreeForm.cs是一个具有数据绑定到树对象绑定列表的DataGrid的表单 当我尝试引用项目B中的TreeForm并将其用于Oak对象时,它正在寻找Tree类型的对象 // in project B here.

我有一个C#.NET2.0项目a(类库),它有一个使用树对象的表单(TreeForm)

我有一个项目B,它有一个继承树的类Oak。Oak类向树添加了一些属性

class Oak : ProjectA.Tree
{
   public string LeafColor;
}
类库中的TreeForm.cs是一个具有数据绑定到树对象绑定列表的DataGrid的表单

当我尝试引用项目B中的TreeForm并将其用于Oak对象时,它正在寻找Tree类型的对象

// in project B here.
BindingList<Oak> oaklist = BindingList<Oak>();

private void show_treeform_button_Click(object sender, EventArgs e)
{
   ProjectA.TreeForm tree_form = new ProjectA.TreeForm(oaklist); // this line gives error
   tree_form.Show();
}
//在这里的项目B中。
BindingList-oaklist=BindingList();
私有void显示树表单按钮单击(对象发送者,事件参数e)
{
ProjectA.TreeForm tree\u form=newprojecta.TreeForm(oaklist);//此行给出错误信息
树形式。显示();
}
我曾尝试将Oak对象强制转换为Tree,但出现错误“无法将类型Oak转换为Tree”。如果我只是将项目B中的对象用作树对象,那么效果很好


如何在树窗体中使用项目A中的Oak对象?

似乎您只从项目B中的树继承了Oak,因此项目A不知道Oak是从树继承的。
您应该使用类库,并且两个项目都有对它的引用

如果我没有错的话,你是在试图访问你的橡树(来自ProjB),它是从ProjA内部从树(ProjA)继承的

如果是这样的话,您将得到一个循环引用(a>B>a>B>a..等等),这是不可能的。

您需要发布一个简短但完整的代码示例,以获得任何有意义的帮助。但让我大胆猜测一下

第二个项目(B)是否引用第一个项目(A)?您必须确保类型
在两种情况下实际上是相同的树类型。在您描述的示例中—听起来项目A实际上引用了项目B—在这种情况下,B如何知道

如果在两个项目中都声明了
类-它不是同一个树类。

一个项目必须引用另一个项目的
类,以使此安排按您期望的方式工作

组织此类项目的一般方法是将共享类移动到第三个类库程序集中,并在项目a和项目B中引用该程序集。然后可以正确继承和使用类库公开的类型

编辑:因此,现在您已经发布了一些代码,可以给您更准确的响应。看起来您试图做的是将
Oak
的通用列表传递给一个需要
树的通用列表的方法。这在.NET4之前是无法做到的,它支持通用的一致性(顺便说一句,在接口类型上)

在4之前的C#版本中,您不能执行以下操作:

List<Oak> oaklist = new List<Oak>();
List<Tree> treeList = oaklist; // illegal

是否要将列表声明为
BindingList
,然后向其中添加
Oak
实例,然后将
BindingList
对象传递给a的
TreeForm
构造函数。毕竟项目A不能处理
Oak
对象,因为它对它们一无所知,它们是在项目B中定义的。

问题是在.NET 4.0之前,
TreeForm
类需要一个
BindingList
,而不是
BindingList
。认为我们可以用派生绑定列表替换基是一个常见的错误,但我们不能

幸运的是,我们不需要这样做,因为
BindingList
可以包含
Oak
实例。解决方案是按如下方式声明变量:

BindingList<Tree> oakList = new BindingList<Tree>();
// Add Oaks, pass to TreeForm
BindingList-oakList=newbindingList();
//添加橡树,传递到树形

(有关大脑弯曲的详细信息,请参见Eric Lippert的。)

您尝试执行的操作通常是有效的,因此我们需要(至少)查看Oak的声明以及TreeForm中声明Tree变量的相关部分。此外,树类在哪里定义?在您正在讨论的两个程序集中的一个程序集中还是在第三个程序集中?您是否在两个项目中都声明了树类?添加了一些代码-项目a是一个类库,它使用的是项目a中的树对象。应该更清楚-项目a是一个类库。请参阅更新。
BindingList<Tree> oakList = new BindingList<Tree>();
// Add Oaks, pass to TreeForm