2010-10-01 72 views
4

我試圖從一個對象傳遞一個結構到另一個對象。我有以下代碼:C# - 將結構從一個對象傳遞到另一個對象

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

在每個類中的結構被聲明爲公共類變量並且是相同的。

感謝您的幫助!

回答

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(); 
3

嗯,這並不是說他們必須張玉峯,他們必須有相同的類型......兩個相同的結構(相同的名字,相同的字段,等等。 )在不同的命名空間中不能不經意地從一個轉換到另一個。

要麼你寫一個implicit conversion從一個結構到另一個,或者你使用相同的地方(這將是推薦的做法)。

1

這些是兩個不同的結構;事實上它們的定義並不重要......它們是不同的。您需要在代碼中使用其中一種。

0

如果有兩個獨立的結構體定義,那麼無論它們有多相似或相同,都不能從一個轉換爲另一個。編譯器會將其標記爲錯誤。

自然的事情很可能是隻有一個結構定義(將其公開,在其自己的cs文件定義它),然後在這兩個地方

使用它或者你可以有自己的轉換方法。如果你需要做這個「左手 - 右手」的東西很多,那麼我肯定會推薦像http://automapper.codeplex.com/這樣的東西,儘管我相信它只能對物體進行操作。

2

選項

  1. 刪除結構的一個定義,並在這兩個地方使用相同的定義。最有可能的是最好不要讓它作爲另一個班級的成員,而是你在多個地方使用它。

  2. 爲一個結構創建一個構造函數,該構造函數接受要複製的實例並複製所有值。有時候這很有用(如果結構體具有不同的成員方法和重疊但不同的目的),但大多數情況下這只是浪費開發人員和執行時間的一種愚蠢的方式。

除非你確定要選擇2(你可能就不會問這個問題,如果你是),去選擇1

相關問題