不能在匿名方法中使用ref或out参数

时间:2015-04-17 11:41:37

标签: c# xml lambda

如果有人可以帮我解决问题,我的c#中的代码有问题。

在函数中,我正在解析Xml文件并将其保存到结构中。

然后我尝试从具有特定节点ID的所述结构中检索一些信息,并且我的代码失败并带有

  

"无法使用参考或输出参数' c'在匿名方法,lambda表达式或查询表达式中,#34;

这是我的代码:

public void XmlParser(ref Point a, ref Point b, ref Point c)
{
     XDocument xdoc = XDocument.Load(XmlDirPath); 
     var coordinates = from r in xdoc.Descendants("move")
                        where int.Parse(r.Attribute("id").Value) == c.NodeID  // !! here is the error !!
                        select new
                        {
                              X = r.Element("x").Value,
                              Y = r.Element("y").Value,
                              Z = r.Element("z").Value, 
                              nID = r.Attribute("id").Value
                         };

     foreach (var r in coordinates)
     {
          c.x = float.Parse(r.X1, CultureInfo.InvariantCulture);
          c.y = float.Parse(r.Y1, CultureInfo.InvariantCulture);
          c.z = float.Parse(r.Z1, CultureInfo.InvariantCulture);
          c.NodeID = Convert.ToInt16(r.nID);
     }
}

public struct Point
{
    public  float x;
    public  float y;
    public  float z;
    public  int   NodeID;
}

3 个答案:

答案 0 :(得分:7)

好吧,您不允许在匿名方法或lambda中使用refout参数,就像编译错误所说的那样。

相反,您必须将ref参数中的值复制到局部变量中并使用:

var nodeId = c.NodeID;
var coordinates = from r in xdoc.Descendants("move")
    where int.Parse(r.Attribute("id").Value) == nodeId
    ...

答案 1 :(得分:3)

正如其他答案中所建议的那样,您必须在方法中本地复制ref变量。你必须这样做的原因是因为lambdas / linq查询改变了它们捕获的变量的生命周期,导致参数比当前方法帧更长寿,因为在方法帧不再在堆栈上之后可以访问该值。

有一个有趣的答案here可以解释为什么你不能在匿名方法中使用ref / out参数。

答案 2 :(得分:2)

您应该从匿名方法中取出ID

var nodeId = c.NodeID;

var coordinates = from r in xdoc.Descendants("move")
                           where int.Parse(r.Attribute("id").Value) == nodeId