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

VB.NET继承C# OpenTelemetry.Trace Sampler类遇in参数修饰符问题

VB.NET继承OpenTelemetry Sampler抽象类的问题解决

问题梳理

  • 基于.NET Framework 4.6.2的VB.NET项目,继承OpenTelemetry.Trace的C#抽象类Sampler时,VS自动生成的代码带有IsReadOnlyAttribute,但该属性仅在.NET Framework 4.7.1及以上版本的System.Runtime.CompilerServices中存在,导致报错。
  • 升级到.NET Framework 4.8后仍报错,测试普通函数可正常运行,问题集中在in参数修饰符上,怀疑是C#转VB的兼容细节问题。

解决办法

不升级.NET Framework 4.6.2的方案

如果暂时无法升级框架,放弃使用VS自动实现抽象类的功能,手动编写实现代码:

  1. 自行定义Sampler的实现类,跳过VS的自动生成流程。
  2. 针对C#中带in修饰的参数,VB里直接去掉in修饰符,改为按值传递——VB原生不支持in修饰符,但按值传递可以实现等价的只读逻辑。
  3. 直接忽略自动生成的IsReadOnlyAttribute,这个属性仅作为编译器提示使用,4.6.2环境下不存在也不会影响核心功能运行。

升级到.NET Framework 4.8后的修复方案

升级后仍因in参数报错,是VB对C#的in修饰符兼容存在细节差异,按以下步骤处理:

  1. 手动重写抽象方法,不要依赖VS自动生成的代码。例如C#中的抽象方法为:
    public abstract SamplingResult ShouldSample(in SamplingParameters samplingParameters);
    
    在VB.NET中实现时去掉in修饰符,写成:
    Public Overrides Function ShouldSample(samplingParameters As SamplingParameters) As SamplingResult
        ' 你的业务逻辑代码
    End Function
    
  2. 如果SamplingParameters是值类型,VB按值传递的性能差异可以忽略;如果是引用类型,按值传递传递的是引用,和C#的in效果一致。
  3. 确认项目引用的OpenTelemetry.Trace包版本与.NET Framework 4.8兼容,避免包版本不匹配引发隐性错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 13:05:44