使用in关键字传递参数为何触发C# 9.0编译器报错?
问题排查与解决方案
1. 检查SpanContext的类型
in关键字在C# 7.2中仅支持值类型作为参数,C# 8.0才扩展支持readonly引用类型。如果SpanContext是普通引用类型(class),在C# 7.3/9.0中使用in修饰参数传递会直接触发编译错误:
- 若
SpanContext是struct(值类型):继续排查其他原因; - 若
SpanContext是class:要么将项目语言版本升级到C# 8.0及以上,要么调用时移除in关键字(需确认方法是否允许,若方法定义强制要求in,只能升级语言版本)。
2. 确认项目的语言版本设置
即使编译器版本是v9.0(对应.NET 5),如果项目的语言版本被手动设置为低于7.2,也会导致in关键字无法被识别:
- 右键项目 → 属性 → 生成 → 高级 → 语言版本,选择
C# 7.2或更高版本(如C# 9.0)。
3. 检查方法定义与调用的兼容性
如果StartActiveSpan是第三方库中的方法,需确认该库的编译语言版本:
- 若库是用C# 8.0+编译的(使用了readonly引用类型的
in参数),而你的项目语言版本低于8.0,调用时就会报错,此时必须升级项目语言版本。
4. 临时变量传递的问题
如果调用时传递的parentContext是一个临时表达式(如in new SpanContext()),在C# 7.3中对于值类型是允许的,但如果是引用类型则不支持。若属于这种情况,可先将表达式赋值给变量,再用in传递变量(仅适用于值类型)。
内容的提问来源于stack exchange,提问作者Yossi G.
相关产品推荐
相关产品推荐

