C#的ref locals是使用一个名为托管指针的CLR功能实现的,它具有自己的一组限制,但幸运的是,不可变的不是其中之一。即在ILAsm中,如果你有一个托管指针类型的局部变量,那么完全有可能改变这个指针,使其“引用”另一个位置。 (C ++ / CLI还将此功能公开为interior pointers。)
在ref本地读取C#documentation,在我看来C#的ref本地是,即使基于CLR的托管指针,也不可重定位;如果它们被初始化为指向某个变量,则不能使它们指向别的东西。我尝试过使用
{
"Id": "L2VtcGxveWVlcy9lbXBsb3llZS10ZXN0LmNzdg==",
"Name": "employee-test.csv",
"DisplayName": "employee-test.csv",
"Path": "/employees/employee-test.csv",
"LastModified": "2017-09-04T10:13:21Z",
"Size": 507,
"MediaType": "text/csv",
"IsFolder": false,
"ETag": "\"0x8D4F37D9209EC29\"",
"FileLocator": "L2VtcGxveWVlcy9lbXBsb3llZS10ZXN0LmNzdg==",
"LastModifiedBy": null
}
和类似的结构,无济于事。
我甚至试图在IL中编写一个包含托管指针的小结构,就C#而言它是有效的,但是CLR似乎不喜欢在结构中有一个托管指针,即使在我的用法它永远不会进入堆。
是否真的不得不求助于使用IL或者递归来解决这个问题? (我正在实现一个数据结构,需要跟踪其遵循的指针,完全使用托管指针。)