如何解决不同命名空间TaxInvoiceVM初始化变量的CS0173错误?
解决CS0173:条件表达式类型无法确定的问题
我尝试从两个分属不同命名空间的参数初始化名为model的变量,代码实现如下:
public void ManipulateSharedLines(XElement root, string cbcPrefix, Simple.TaxInvoiceVM simpleModel, Standard.TaxInvoiceVM standardModel) { var model = simpleModel != null ? simpleModel : standardModel; }
运行代码时触发了CS0173错误:
Error CS0173 Type of conditional expression cannot be determined because there is no implicit conversion between 'Models.Simple.TaxInvoiceVM' and 'Models.Standard.TaxInvoiceVM'
两个模型包含完全相同的属性:
public string ProfileID { get; set; } public string ID { get; set; } public string UUID { get; set; }
且它们被用于相同的函数中,请问该如何正确初始化model变量?
方法1:定义公共接口(推荐)
既然两个类的属性完全一致,最规范的做法是定义一个公共接口,让两个类都实现该接口,从根源上统一类型:
// 定义公共接口 public interface ITaxInvoiceVM { string ProfileID { get; set; } string ID { get; set; } string UUID { get; set; } } // 修改Simple命名空间下的类实现接口 namespace Models.Simple { public class TaxInvoiceVM : ITaxInvoiceVM { public string ProfileID { get; set; } public string ID { get; set; } public string UUID { get; set; } } } // 修改Standard命名空间下的类实现接口 namespace Models.Standard { public class TaxInvoiceVM : ITaxInvoiceVM { public string ProfileID { get; set; } public string ID { get; set; } public string UUID { get; set; } } }
之后就可以将model声明为接口类型,编译器能自动识别类型:
ITaxInvoiceVM model = simpleModel ?? standardModel; // 等价于原条件表达式的简化写法
方法2:显式类型转换(无需修改原有类)
如果无法修改原有类的定义,可以通过显式转换强制指定统一类型:
方式A:转换为object类型
object model = simpleModel != null ? simpleModel : (object)standardModel;
注意:后续使用model时需要根据实际类型强制转换,否则无法直接访问属性。
方式B:使用dynamic类型
dynamic会跳过编译时类型检查,运行时自动解析属性:
dynamic model = simpleModel != null ? simpleModel : standardModel; // 直接访问属性 var profileId = model.ProfileID;
缺点:失去编译时类型校验,若后续类结构变更,容易引发运行时错误。
方法3:创建公共DTO并映射
如果不想修改原有类,也可以创建一个公共的数据传输对象(DTO),将两个模型的属性映射到DTO中:
// 定义公共DTO public class TaxInvoiceDto { public string ProfileID { get; set; } public string ID { get; set; } public string UUID { get; set; } }
初始化时完成属性映射:
TaxInvoiceDto model; if (simpleModel != null) { model = new TaxInvoiceDto { ProfileID = simpleModel.ProfileID, ID = simpleModel.ID, UUID = simpleModel.UUID }; } else { model = new TaxInvoiceDto { ProfileID = standardModel.ProfileID, ID = standardModel.ID, UUID = standardModel.UUID }; }
这种方式类型安全,但需要手动维护映射逻辑,属性变更时需同步更新。
内容的提问来源于stack exchange,提问作者Fares Ayyad
相关产品推荐
相关产品推荐

