C # Назначение / приведение к полям объекта в структуре - PullRequest
1 голос
/ 29 сентября 2011

Извините за этот вопрос новичка, я очень плохо знаком с 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())
{
   ...
}

Спасибо, Юрген

1 Ответ

6 голосов
/ 29 сентября 2011

Вы не можете, в этом случае. Вы не дали полный фрагмент, но я подозреваю, что это что-то вроде этого:

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

Теперь, поскольку MT5Command является структурой, вы получаете копию любого значения в someCollection. Изменение собственности почти наверняка не будет делать то, что вы хотели, в любом случае. Компилятор защищает вас от себя, делая переменную command доступной только для чтения. Вы могли бы сделать это:

MT5Command copy = command;
copy.OutParam = SrvAttributes;

... но я сильно подозреваю, что это не то, что вы хотите.

Как правило, это действительно плохая идея иметь изменяемые структуры, подобные той, с которой вы пришли - и это не похоже на то, что это должна быть структура во-первых. 1016 *

Для получения дополнительной информации:

...