显然,您不能在结构体的方法中使用关键字“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
问题:
- 结构体中的方法不能使用关键字“this”的技术原因是什么?
- 有没有一种优雅的方法来解决这个问题,这样我就不必每次想要给定坐标的可能数字列表时都手动键入反射代码?
最佳答案
原因是结构是按值传递的,而不是按引用传递的。在此上下文中使用 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/