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

.NET REST API中初始化DTO遇CS9035编译错误求助

CS9035编译错误排查与解决

CS9035的核心问题是:编译器无法通过new(...)的目标类型推断,确定你要创建的具体DTO类型,或者无法明确匹配到对应的构造函数。结合你的场景,以下是具体原因和解决办法:

可能的原因及解决方案

1. 上下文未明确目标类型

如果代码中没有给编译器足够的信息来推断new(...)对应的类型,就会触发错误。比如:

// 错误示例:var无法从参数推断出具体是PTInspectionAndTMDefectsDTO
var dto = new(createdInspection);
// 或参数传递时,方法参数类型不明确
SomeServiceMethod(new(createdInspection));

解决:
直接显式指定DTO类型,放弃依赖目标类型推断:

var dto = new PTInspectionAndTMDefectsDTO(createdInspection);
// 传递参数时也明确类型
SomeServiceMethod(new PTInspectionAndTMDefectsDTO(createdInspection));

2. 构造函数存在匹配歧义

如果你的DTO有两个构造函数,且createdInspection的类型可以隐式转换为另一个构造函数的参数类型,编译器无法确定调用哪一个。比如:

// DTO构造函数定义
public PTInspectionAndTMDefectsDTO(PTINSPECTION ptInspection) { ... }
// 第二个构造函数的参数类型可隐式转换为PTINSPECTION
public PTInspectionAndTMDefectsDTO(PTInspectionViewModel vm) { ... }

解决:

  • 显式转换参数类型,明确匹配目标构造函数:
var dto = new PTInspectionAndTMDefectsDTO((PTINSPECTION)createdInspection);
  • 或修改构造函数,消除参数类型的隐式转换歧义(比如给第二个构造函数增加更多参数)。

3. 构造函数访问权限不足

如果接收PTINSPECTION的构造函数不是public(比如是internal),而控制器所在程序集无法访问该构造函数,也可能触发CS9035(部分场景下会替代权限错误提示)。

解决:
确保该构造函数的访问修饰符为public,或者调整程序集访问权限(比如添加InternalsVisibleTo特性)。

4. 目标类型推断的限制

.NET的new(...)推断存在一些限制,比如当DTO有子类且上下文可能匹配子类时,编译器无法确定具体类型;或者用于非泛型方法的类型参数推断时也会出错。

解决:
始终显式指定DTO类型,避免依赖推断。

修正示例

错误代码:

[HttpPost]
public IActionResult AddPTInspectionAndDefects(PTINSPECTION model)
{
    var createdInspection = _ptInspectionService.Create(model);
    // 触发CS9035
    var dto = new(createdInspection);
    return Ok(dto);
}

修正后:

[HttpPost]
public IActionResult AddPTInspectionAndDefects(PTINSPECTION model)
{
    var createdInspection = _ptInspectionService.Create(model);
    // 显式指定DTO类型
    var dto = new PTInspectionAndTMDefectsDTO(createdInspection);
    return Ok(dto);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 07:15:12