2011-09-29 43 views
1

對不起,這個新手問題,我是C#的新手,它的語義。我有以下結構:C#分配/轉換到結構中的對象字段

public struct MT5Command{ 

    public MT5CommandType Type{ get; set;} 

    public AutoResetEvent ThreadWaitHandle { get; set; } 

    public object InParam { get; set; } 

    public object OutParam { get; set; } 

} 

而這個代碼片段:

MT5Command Cmd = new MT5Command(); 
Cmd.Type = MT5CommandType.GetServerInformation; 
Cmd.ThreadWaitHandle = waitHandle.Value; 
attributes = new ServerAttributes(); 
Cmd.OutParam = attributes; 
.... 
ServerAttributes SrvAttributes = new ServerAttributes(); 
Cmd.OutParam = (ServerAttributes)SrvAttributes; 

最後一行不會編譯:不能修改的「命令」成員,因爲它是一個「的foreach迭代變量」 如何是否可以將OutParam字段分配給另一個ServerAttributes結構?

這是外for-each循環:

foreach (MT5Command Cmd in mCommandQueue.GetConsumingEnumerable()) 
{ 
    ... 
} 

感謝,克林斯曼

+2

您需要在代碼段的foreach循環。但基本上,你正在做'foreach(MT5Command foo in bar){foo.OutParam = ...}'。您可以改爲使用for-loop並直接訪問您的集合元素,例如。 '杆[I]'。 – ashes999

回答

6

你不能,在這種情況下。您還沒有給出完整的片段,但我懷疑這是這樣的:

foreach (MT5Command command in someCollection) 
{ 
    // Code as posted 
} 

現在因爲MT5Command是一個結構,你得到的任何值是someCollection一個副本。改變財產幾乎肯定不會做你想做的事情。編譯器通過使command變量爲只讀來保護您不受自己的影響。你可以這樣做:

MT5Command copy = command; 
copy.OutParam = SrvAttributes; 

......但我強烈懷疑這不是你想要的。

作爲一個規則,它是一個真的很糟糕的主意有可變的結構,就像你想出的結構 - 聽起來不像這應該是一個結構。

欲瞭解更多信息:

+0

我只想給一個結構賦值。在C++中,我會用指向這個結構體的指針來完成它。 C#中的等價物是什麼?我必須使用不安全的代碼嗎? – Juergen

+2

@Juergen:不,你必須知道C#和C++是非常不同的。你可能只想在這裏上一堂課 - 但是,你真的很重要,你可以把C#作爲一種獨立於C++的語言來學習。你*不能*只是嘗試將C++習語應用於C#;你最終會得到可怕的代碼。 –

+0

我已經將MT5Command變量作爲ref參數傳遞給隊列。所以我認爲這些結構通過引用傳遞,然後我可以稍後使用它們。那麼,如果我只是把所有的結構都作爲類,所有的問題都沒有了? – Juergen