You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何无法获取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对应的对象地址,可通过以下步骤:

  1. 将属性返回的对象引用赋值给一个局部变量(局部变量是可寻址的存储位置)
  2. 对局部变量进行地址操作(或获取对象的内存地址)

示例代码(需启用unsafe上下文):

unsafe
{
    // 先把属性值赋值给局部变量
    var targetConn = connectionManager.Connection;
    // 获取局部变量的地址(存储的是对象引用)
    Connection* connPtr = &targetConn;
    // 如果要获取对象本身的内存地址,可转换为IntPtr
    IntPtr objAddr = (IntPtr)(object)targetConn;
}

内容的提问来源于stack exchange,提问作者Dominique

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 02:05:19