C# C将/转换为结构中的对象字段

C# C将/转换为结构中的对象字段,c#,casting,struct,field,C#,Casting,Struct,Field,很抱歉这个新手的问题,我对C非常陌生,而且它是语义学的。我有以下结构: public struct MT5Command{ public MT5CommandType Type{ get; set;} public AutoResetEvent ThreadWaitHandle { get; set; } public object InParam { get; set; } public object OutParam { get; set; } }

很抱歉这个新手的问题,我对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;
最后一行未编译:无法修改“command”的成员,因为它是“foreach迭代变量” 如何将OutParam字段分配给另一个ServerAttributes结构

这是每个循环的外部参数:

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

谢谢,尤尔根,在这种情况下,你不能。您还没有给出完整的代码片段,但我怀疑是这样的:

foreach (MT5Command command in someCollection)
{
    // Code as posted
}
现在,因为MT5Command是一个结构,所以您将获得某个集合中任何值的副本。无论如何,更改属性几乎肯定不会达到您想要的效果。编译器将命令变量设置为只读,从而保护您免受自己的伤害。您可以这样做:

MT5Command copy = command;
copy.OutParam = SrvAttributes;
。。。但我强烈怀疑这不是你想要的

一般来说,像您提出的那样使用可变结构是一个非常糟糕的主意,而且听起来不应该是一个结构

有关更多信息:


在这种情况下,你不能。您还没有给出完整的代码片段,但我怀疑是这样的:

foreach (MT5Command command in someCollection)
{
    // Code as posted
}
现在,因为MT5Command是一个结构,所以您将获得某个集合中任何值的副本。无论如何,更改属性几乎肯定不会达到您想要的效果。编译器将命令变量设置为只读,从而保护您免受自己的伤害。您可以这样做:

MT5Command copy = command;
copy.OutParam = SrvAttributes;
。。。但我强烈怀疑这不是你想要的

一般来说,像您提出的那样使用可变结构是一个非常糟糕的主意,而且听起来不应该是一个结构

有关更多信息:


您需要在代码段中包含foreach循环。但基本上,您在bar{foo.OutParam=…}中执行类似于foreach MT5Command foo的操作。您可以改为使用for循环并直接访问集合元素,例如bar[i]。您需要在代码段中包含foreach循环。但基本上,您在bar{foo.OutParam=…}中执行类似于foreach MT5Command foo的操作。您可以改为使用for循环并直接访问集合元素,例如bar[i]。我只想给结构赋值。在C++中,我会用指向这个结构的指针来完成。C中的等价物是什么?“我必须使用不安全的代码吗?”Juergen:不,你必须知道C和C++是非常不同的。你可能只想在这里学习一个类,但是把C作为C++语言作为一种独立的语言学习是非常重要的。你不能只是尝试将C++习语应用到C语言中;你会得到一段糟糕的代码。我已经将MT5Command变量作为ref参数传递给了一个队列。所以我认为这些结构是通过引用传递的,我可以在以后使用它们。那么,如果我只是把所有的结构都做成类,那么所有的问题都消失了?@Juergen:你可能也需要阅读我关于参数传递的文章:如果你做成了结构类,那么你眼前的问题可能就消失了,但还有一个更长期的问题,那就是命中和希望编码。你应该理解你正在使用的语言,而不是根据另一种语言猜测它的语义。我非常强调真正理解引用类型和值类型之间的区别是多么重要。你完全正确,我只是认为结构就是结构;-谢谢,JonI,我只想给结构赋值。在C++中,我会用指向这个结构的指针来完成。C中的等价物是什么?“我必须使用不安全的代码吗?”Juergen:不,你必须知道C和C++是非常不同的。你可能只想在这里学习一个类,但是把C作为C++语言作为一种独立的语言学习是非常重要的。你不能只是尝试将C++习语应用到C语言中;你会得到一段糟糕的代码。我已经将MT5Command变量作为ref参数传递给了一个队列。所以我认为这些结构是通过引用传递的,我可以在以后使用它们。那么,如果我只是把所有的结构都做成类,那么所有的问题都消失了?@Juergen:你可能也需要阅读我关于参数传递的文章:如果你做成了结构类,那么你眼前的问题可能就消失了,但还有一个更长期的问题,那就是命中和希望编码。你应该理解你正在使用的语言,而不是根据另一种语言猜测它的语义。我非常强调真正理解引用类型和值类型之间的区别是多么重要。你完全正确,我只是认为结构就是结构;-谢谢你,乔恩