C# 如何将 'this' 关键字破解/修复到结构中?

标签 c# struct this

显然,您不能在结构体的方法中使用关键字“this”。 请注意,在下面的示例中,我没有显式键入“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
}

错误:

Error 1 Anonymous methods, lambda expressions, and query expressions inside structs cannot access instance members of 'this'. Consider copying 'this' to a local variable outside the anonymous method, lambda expression or query expression and using the local instead. C:\Projects\Sodoku\SodokuSolver\Sodoku\LaurenceAI.cs 367 74 Sodoku

问题:

  1. 结构体中的方法不能使用关键字“this”的技术原因是什么?
  2. 有没有一种优雅的方法来解决这个问题,这样我就不必每次想要给定坐标的可能数字列表时都手动键入反射代码?

最佳答案

原因是结构是按值传递的,而不是按引用传递的。在此上下文中使用 this 的结果通常不是您想要的 - 它将访问副本的 this 指针,而不是外部对象,这会非常令人困惑当您所做的任何分配未显示在外部调用中时。在这种特定情况下,这很烦人,但总的来说,它可以阻止更多奇怪的错误。

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

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

关于C# 如何将 'this' 关键字破解/修复到结构中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34301627/

相关文章:

c# - 使用 LINQ 处理 C# 字典

c# - 队列中未处理的项目修改数据库状态 - 如何处理并发数据请求?

c - 访问链表中的结构

java - 扩展 ArrayList 并在构造函数中引用反序列化对象

c# - 打开文件://URI to specific# (hash) ID

xml - 如何从不在重复项中使用结束标记的嵌套 xml 中获取数据?

c - 交换链表中的节点?

javascript - 代码输出一个数字而不是未定义的?

javascript - 为什么在 JavaScript 中为实例变量声明原型(prototype)属性

c# - 检查2个字符串数组中是否存在任何字符串