.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
相关产品推荐
相关产品推荐

