2011-09-29 23 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の反復変数 ' 方法であるため、「コマンド」のメンバーを変更することはできません他のServerAttributes構造体にOutParamフィールドを割り当てることは可能ですか?

これがfor-eachループの外である:

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

おかげで、ユルゲン

+2

:詳細については

。しかし基本的に、あなたは 'foreach(barでMT5コマンドfoo){foo.OutParam = ...}'のようなことをしています。代わりにfor-loopを使用してコレクション要素に直接アクセスすることができます。 'bar [i]'。 – ashes999

答えて

6

あなたがすることはできません、この場合には。 MT5Commandが構造体であるので、あなたはsomeCollectionであるどのような値のコピーを取得している今

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

:あなたは完全なスニペットを与えられていないが、私はそれがこのようなものだと思います。プロパティをほぼ確実に変更することは、あなたがとにかくそれを望んでいなかったでしょう。コンパイラは、 command変数を読み取り専用にすることで、自分自身を保護しています。あなたはこれを行うことができます:

MT5Command copy = command; 
copy.OutParam = SrvAttributes; 

...しかし、私はあなたが望むものではないと強く疑う。

原則として、本当に悪い考えです。あなたが思いついたもののような可変構造体を持つことはまずありません。最初の場所では構造体でなければなりません。あなたは、コードスニペットであなたのforeachループを含める必要が

+0

構造体に値を代入したいだけです。私はこの構造体へのポインタでそれを行うだろうC + +で。 C#で同等のものは何ですか?安全でないコードを使用する必要がありますか? – Juergen

+2

@Juergen:いいえ、C#とC++が非常に異なることを知る必要があります。 C#をC++とは別の言語として学ぶことは本当に重要です。あなたは*単にC++のイディオムをC#に適用しようとしてはいけません。ひどく壊れたコードで終わるでしょう。 –

+0

MT5Command変数を参照パラメータとしてキューに渡しました。だから私は、これらの構造体は参照渡しと思ったし、後で使用することができます。だから、すべての構造体をクラスとして作成すれば、すべての問題は解消されますか? – Juergen

関連する問題