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自动实现抽象类的功能,手动编写实现代码:
- 自行定义
Sampler的实现类,跳过VS的自动生成流程。 - 针对C#中带
in修饰的参数,VB里直接去掉in修饰符,改为按值传递——VB原生不支持in修饰符,但按值传递可以实现等价的只读逻辑。 - 直接忽略自动生成的
IsReadOnlyAttribute,这个属性仅作为编译器提示使用,4.6.2环境下不存在也不会影响核心功能运行。
升级到.NET Framework 4.8后的修复方案
升级后仍因in参数报错,是VB对C#的in修饰符兼容存在细节差异,按以下步骤处理:
- 手动重写抽象方法,不要依赖VS自动生成的代码。例如C#中的抽象方法为:
在VB.NET中实现时去掉public abstract SamplingResult ShouldSample(in SamplingParameters samplingParameters);in修饰符,写成:Public Overrides Function ShouldSample(samplingParameters As SamplingParameters) As SamplingResult ' 你的业务逻辑代码 End Function - 如果
SamplingParameters是值类型,VB按值传递的性能差异可以忽略;如果是引用类型,按值传递传递的是引用,和C#的in效果一致。 - 确认项目引用的
OpenTelemetry.Trace包版本与.NET Framework 4.8兼容,避免包版本不匹配引发隐性错误。
内容的提问来源于stack exchange,提问作者Jaie
相关产品推荐
相关产品推荐

