我正在尝试将结构从一个对象传递到另一个对象。我有以下代码:
private void mainMenuStripNewProject_Click(object sender, EventArgs e)
{
frmNewProject frmNewProject = new frmNewProject(this);
if (frmNewProject.ShowDialog() == DialogResult.OK)
{
StructProjectSettings tempProjectSettings = frmNewProject.getSettings();
newProjectEvent(tempProjectSettings); //Fetchs settings from the new project form
}
}
但是,我收到以下错误:
错误14无法将类型'NathanUpload.frmNewProject.StructProjectSettings'隐式转换为'NathanUpload.Main.StructProjectSettings'o:\ daten \ visual studio 2010 \ Projects \ NathanUpload \ NathanUpload \ Main.cs 43
每个类中的结构都是声明的公共类变量,并且是相同的。
提前感谢您的帮助!
答案 0 :(得分:9)
您是否定义了每个类中的实际结构?
即使您对它们使用相同的名称,编译器也不会将它们视为相同的类型。
你必须在一个地方定义结构,并从需要使用它的两个类中创建它的对象。
一个例子
public class A{
public struct MyStruct{
...
}
}
public class B{
public struct MyStruct{
...
}
}
A.MyStruct struct1 = new B.MyStruct();
这是不允许的,这实际上是你想要做的。我建议将结构移出类,并将它放在两个类都可以访问它的地方。
将其定义为
public struct MyStruct{
...
}
public class A{
...
}
public class B{
...
}
MyStruct struct1 = new MyStruct();
答案 1 :(得分:3)
嗯,并不是说它们必须是混淆的,它们必须具有相同的类型......不同命名空间中的两个相同的结构(相同的名称,相同的字段等)不能强制性地从一个转换为另一个。
要么从一个结构体到另一个结构体写一个implicit conversion,要么在任何地方使用相同的结构(这是推荐的方法)。
答案 2 :(得分:2)
选
删除其中一个结构的定义,并在两个地方使用相同的定义。最有可能的是,如果你在不止一个地方使用它,最好不要将它作为另一个类的成员。
为一个结构创建一个构造函数,该结构获取正在复制的实例并复制所有值。有时这很有用(如果结构具有不同的成员方法和重叠但不同的目的),但大多数情况下,它只是浪费开发人员和执行时间的愚蠢方式。
除非你确定你想要选项2(并且你可能不会问这个问题),否则请选择选项1.
答案 3 :(得分:1)
这是两种不同的结构;他们被平等定义的事实并不重要......他们是不同的。您需要在代码中使用其中一个。
答案 4 :(得分:0)
如果有两个eparate结构定义,则无论它们有多相似或相同,都无法将它们从一个转换为另一个。编译器会将其标记为错误。
自然要做的可能是只有一个结构定义(公开,在自己的.cs文件中定义),然后在两个地方使用它
或者您可以拥有自己的转换方法。如果你需要做很多“左手 - 右手”的东西,那么我肯定会推荐像http://automapper.codeplex.com/这样的东西,尽管我相信它只适用于物体。