2016-05-12 22 views
0

我最近將一個VB類轉換爲C#,它似乎遇到了問題;我想我知道如何解決這個問題,但是隨着我的閱讀,我現在正在尋找一個更明確的答案和指導。 考慮下面的代碼和一個結構FileDetail裏面(這只是一個例子 - 所以請不要假設它是FileDetail在文件..) 結構需要在內部和外部訪問 - 它們是通過值傳遞,而不是參考類型如此struct似乎是去這裏而不是類的方式(查看整個代碼)。在表單類MyForm中,我得到了類IAFT中不存在FileDetails的錯誤。在其他類的類內部使用Structs

public class IAFT 
{ 
    public struct FileDetail 
    { 
     public string FileType; 
     public int FileNumber; 
    } 
} 

public class MyForm 
{ 
    MyForm() 
    { 
     public IAFT.FileDetail fd = new IAFT.FileDetail(); 
     // IAFT.FileDetail 
    } 
} 

錯誤我得到了。 類型名稱'FileDetail'在類型'IAFT'(CS0426)中不存在 VS2013中的紅色波形處於類型聲明中;作業的左側。

兩者在相同的命名空間,如果這是任何幫助。

我已經閱讀了關於SO的帖子,告訴我我可以像上面那樣聲明我的變量fd(因爲我沒有實例,所以對我沒有意義 - 但我試過了。)我不想創建一個實例來獲取實例;我相信我想要那個在IAFT實例中存在的那個。也許有一些我不理解。

我應該將結構封裝爲類嗎? 我應該把這個結構放在IAFT類之外嗎? [這就是我在想我應該做的事。]

我應該做點什麼嗎?

+0

IAFT必須是靜態的,您不必實際創建一個實例訪問它。 – user3953989

+4

如果您需要從其他類訪問它,則不應將其封裝在另一個類中。自己拉出來。 –

+1

如果你讓你的'MyForm' ctor公開,並刪除ctor內的'public'關鍵字,這實際上編譯和運行,就像它不可取。 – Jonesopolis

回答

1

你的代碼示例是錯誤的,不會編譯。你的錯誤是你正在刪除

public IAFT.FileDetail fd = new IAFT.FileDetail(); 

在公共構造函數裏面。您無法在函數scoped變量中聲明範圍。如果你把公共聲明關閉你的代碼編譯就好了。

所以試試這個;

public class IAFT 
{ 
    public struct FileDetail 
    { 
     public string FileType; 
     public int FileNumber; 
    } 
} 

public class MyForm 
{ 

    public MyForm() 
    { 
     IAFT.FileDetail fd = new IAFT.FileDetail(); 
    } 
} 

它非常適合嵌套類。

+1

'它是完美的練習嵌套類.'嗯,它*工程*在這種情況下。這並不意味着以這種方式做這件事是一個好主意。 – Servy

+0

你在這裏推斷壞習慣的理由是什麼?它完全由語言支持,並且可以使代碼更加整潔 - 它是命名空間的另一種方式。它的優點是在課程之外你必須用全名引用它,因爲你不能使用「使用」。它不常見但有效。 – PhillipH

+0

@Servy如果嵌套有任何意義(它只保存該類的數據,它只用於調用它們的函數等),我沒有看到任何問題。爲什麼這樣做不是一個好主意? (好奇) – Gusman

-5

我會以這種方式:

public class IAFT 
{ 
    fileDetail FileDetail = new fileDetail(); 
} 

public class fileDetail 
{ 
    public string FileType; 
    public int FileNumber; 
} 

public class MyForm 
{ 
    MyForm() 
    { 
     IAFT.FileDetail.FileType = "test"; 
     //IAFT.FileDetail 
    } 
} 

我希望它的作品,我沒有測試它。

+0

有人可以解釋爲什麼這不是一個好主意嗎? – TheSkilluminati

+1

好吧,它不會工作。 IAFT尚未初始化,並且FileDetail屬性不是靜態的,所以不會編譯。 – PhillipH

0

沒有必要做結構靜態也不要將它移動到外面,問題在於你聲明var在函數中是公共的,這是不允許的,localvariables沒有訪問修飾符,因爲它們是本地的。

試試這個:

public class IAFT 
{ 
    public struct FileDetail 
    { 
     public string FileType; 
     public int FileNumber; 
    } 
} 

public class MyForm 
{ 
    public IAFT.FileDetail fd = new IAFT.FileDetail(); 
}