C#如何破解/修复这个'关键字到结构?

时间:2015-12-15 23:48:45

标签: c# struct this

显然你不能使用关键字"这个"在结构中的方法中。 请注意,在下面的示例中,我没有明确键入"这个"但是当我引用属性" X"或" Y"。

我的结构:

public struct Coord
{
    public int X;
    public int Y;
    public Coord(int x, int y)
    {
        X = x;
        Y = y;
    }
    // some other methods omitted

    public List<int> GetPossibles()
    {
        return LaurenceAI.Values.Where(n => LaurenceAI.Possibilities[X, Y, n]).ToList();
    }
}

用法示例:

foreach(int numeral in targetCoord.GetPossibles())
{
   //do stuff
}

错误:

  

错误1结构体内的匿名方法,lambda表达式和查询表达式无法访问&#39; this&#39;的实例成员。考虑复制这个&#39;到匿名方法,lambda表达式或查询表达式之外的局部变量,而使用本地变量。 C:\ Projects \ Sodoku \ SodokuSolver \ Sodoku \ LaurenceAI.cs 367 74 Sodoku

问题:

  1. 结构中的方法不能使用关键字&#34;这&#34;?
  2. 的技术原因是什么?
  3. 有没有一种优雅的方法可以解决这个问题,这样每次我想要一个给定Coord的可能数字列表时,我都不必长时间输出反射代码?

1 个答案:

答案 0 :(得分:4)

原因是结构是按值传递的,而不是通过引用传递的。在此上下文中使用this通常不会导致您想要的内容 - 它将访问副本的this指针,而不是外部对象,并且在任何时候它都会让您感到困惑您所做的作业不会在外部通话中显示。它在这种特殊情况下很烦人,但总的来说它会阻止更多奇怪的错误。

错误消息实际上为您提供了一个相当合理的解决方案 - 首先复制值。做类似的事情:

public List<int> GetPossibles()
{
    var localX = X;
    var localY = Y;
    return LaurenceAI.Values.Where(n => LaurenceAI.Possibilities[localX, localY, n]).ToList();
}