C#中嵌套三元转if-else出现不可达代码问题求助
用if-else替代对象初始化器中的嵌套三元表达式(解决不可达代码问题)
你遇到的问题核心是:对象初始化器的语法只支持属性赋值表达式,不能直接嵌入if-else执行语句,强行写入会导致语法错误或不可达代码提示。下面提供两种标准写法:
方法一:先计算属性值,再传入初始化器
先通过if-else算出NoOfWell的值,再把结果放到对象初始化器中赋值,逻辑清晰且符合语法要求:
public BrainSubseaJumperInputDTO FillInputDTO(ProjectInfoDTO projectInfoInput = null, BrainConceptsInputDTO conceptInput = null) { var sumOfAllWells = conceptInput?.ConceptDCDetailsInputDTO .Sum(x => x.OilProducerWell + x.GasProducerWell + x.WaterInjectorWell + x.GasInjectorWell) ?? 0; // 提前用if-else计算NoOfWell的值 int noOfWell; if (_brainConceptDCDetailsInput.HydrocacbornType == "Gas") { noOfWell = _brainConceptDCDetailsInput.GasFlowlineSize; } else if (_brainConceptDCDetailsInput.HydrocacbornType == "Oil") { noOfWell = _brainConceptDCDetailsInput.OilFlowlineSize; } else { noOfWell = 0; } return new BrainSubseaJumperInputDTO() { FlowLineSize = sumOfAllWells, NoOfWell = noOfWell }; }
方法二:先创建对象实例,再用if-else赋值
先初始化对象的已知属性,再通过if-else给NoOfWell单独赋值,这种写法更灵活,适合属性较多或逻辑复杂的场景:
public BrainSubseaJumperInputDTO FillInputDTO(ProjectInfoDTO projectInfoInput = null, BrainConceptsInputDTO conceptInput = null) { var sumOfAllWells = conceptInput?.ConceptDCDetailsInputDTO .Sum(x => x.OilProducerWell + x.GasProducerWell + x.WaterInjectorWell + x.GasInjectorWell) ?? 0; // 先创建对象并初始化FlowLineSize var inputDto = new BrainSubseaJumperInputDTO { FlowLineSize = sumOfAllWells }; // 用if-else给NoOfWell赋值 if (_brainConceptDCDetailsInput.HydrocacbornType == "Gas") { inputDto.NoOfWell = _brainConceptDCDetailsInput.GasFlowlineSize; } else if (_brainConceptDCDetailsInput.HydrocacbornType == "Oil") { inputDto.NoOfWell = _brainConceptDCDetailsInput.OilFlowlineSize; } else { inputDto.NoOfWell = 0; } return inputDto; }
额外推荐:用switch表达式简化判断(C# 8.0+)
如果你的项目使用C# 8.0及以上版本,可以用switch表达式替代嵌套三元和if-else,语法更简洁易读:
public BrainSubseaJumperInputDTO FillInputDTO(ProjectInfoDTO projectInfoInput = null, BrainConceptsInputDTO conceptInput = null) { var sumOfAllWells = conceptInput?.ConceptDCDetailsInputDTO .Sum(x => x.OilProducerWell + x.GasProducerWell + x.WaterInjectorWell + x.GasInjectorWell) ?? 0; var noOfWell = _brainConceptDCDetailsInput.HydrocacbornType switch { "Gas" => _brainConceptDCDetailsInput.GasFlowlineSize, "Oil" => _brainConceptDCDetailsInput.OilFlowlineSize, _ => 0 }; return new BrainSubseaJumperInputDTO { FlowLineSize = sumOfAllWells, NoOfWell = noOfWell }; }
内容的提问来源于stack exchange,提问作者andi azamuddin
相关产品推荐
相关产品推荐

