为何无法获取Connection对象内存地址?CS0211报错求解
问题分析:CS0211 无法获取给定表达式的地址
核心原因
出现CS0211: Cannot take the address of the given expression错误的根本原因是:connectionManager.Connection是C#属性(Property),而非字段(Field)。
- C#的属性本质是封装的
get/set方法,并非直接的内存存储位置。&操作符要求操作数是变量、字段或可寻址的存储位置,而属性的get访问器返回的是临时值(或对象引用的副本),无法直接对其取地址。 - 而
Connection_For_Message是字段或局部变量,属于可直接寻址的存储位置,因此可以正常获取地址。
验证依据
你提到直接访问connectionManager.Connection(仅获取数据)一切正常,这完全符合属性的特性:属性的get访问器可以正常返回对象数据,但因为它是方法而非存储位置,所以不能用&取地址。
对比监视窗口结果:
&connectionManager.Connection.TcpConnection能正常获取地址,是因为.TcpConnection最终访问的是Connection对象中的字段(而非属性),属于可寻址的存储位置。&connectionManager.Connection直接针对属性,触发错误。
解决方法
如果需要获取connectionManager.Connection对应的对象地址,可通过以下步骤:
- 将属性返回的对象引用赋值给一个局部变量(局部变量是可寻址的存储位置)
- 对局部变量进行地址操作(或获取对象的内存地址)
示例代码(需启用unsafe上下文):
unsafe { // 先把属性值赋值给局部变量 var targetConn = connectionManager.Connection; // 获取局部变量的地址(存储的是对象引用) Connection* connPtr = &targetConn; // 如果要获取对象本身的内存地址,可转换为IntPtr IntPtr objAddr = (IntPtr)(object)targetConn; }
内容的提问来源于stack exchange,提问作者Dominique
相关产品推荐
相关产品推荐

