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

C#12主构造函数依赖注入疑问:为何方法内参数为Null?

问题分析与解决方案

你的核心问题是:使用C#12主构造函数时,直接在实例方法中引用主构造函数参数出现null,但显式捕获为属性/字段后恢复正常,这和官方文档的示例似乎冲突。

首先排查最可能的低级错误

你的测试代码中实例化类时写的是:

_sut = new SeviceA(mockB);

而你的类名是ServiceA(少了字母r)。如果这是实际代码中的错误,这就是service为null的直接原因——你没有正确创建目标类的实例,可能误定义或引用了其他带无参构造的类。

若拼写是笔误,核心原因与规范说明

根据C#12规范,普通类的主构造函数参数如果被实例成员(如实例方法、属性)引用,编译器会自动将其提升为私有隐式字段,所以你最初的代码理论上是有效的,和官方文档示例逻辑一致。出现null的可能原因包括:

  • 项目语言版本未设置为C#12:检查项目文件(.csproj),确保包含<LangVersion>12.0</LangVersion>或<LangVersion>latest</LangVersion>,低版本C#不支持普通类的主构造函数特性,会导致异常编译行为。
  • SDK/编译器版本过旧:需要.NET 8 SDK及以上版本支持C#12,旧版本编译器无法正确处理主构造函数参数的自动提升。
  • 构造函数冲突:如果ServiceA额外定义了其他构造函数(如无参构造)且未正确初始化主构造函数参数,可能导致实例化时参数未赋值。

可靠的解决方案

  1. 修正测试代码中的类名拼写错误。
  2. 验证项目的.NET SDK版本(需≥8.0)和语言版本设置。
  3. 显式捕获主构造函数参数为字段/属性是一种稳定且清晰的写法,即使依赖编译器自动提升,显式声明也能避免潜在的编译问题,比如你已经实现的方式:
public class ServiceA(IServiceB service)
{
    private IServiceB ServiceProperty { get; } = service;
    public async Task<bool> Method() {
        return await ServiceProperty.GetValue();
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 19:20:14