c# – Resharper陷阱“转换为’返回’声明”
发布时间:2020-12-15 08:39:42 所属栏目:百科 来源:网络整理
导读:鉴于以下例程: private static object ParseNumber(string token,FieldDefinition def){ if (def.Fraction 0) return Double.Parse(token); else return Int64.Parse(token);} Resharper为我提供了将其重构为三元运算符的声明的选项: private static objec
鉴于以下例程:
private static object ParseNumber(string token,FieldDefinition def) { if (def.Fraction > 0) return Double.Parse(token); else return Int64.Parse(token); } Resharper为我提供了将其重构为三元运算符的声明的选项: private static object ParseNumber(string token,FieldDefinition def) { return def.Fraction > 0 ? Double.Parse(token) : Int64.Parse(token); } 谁能发现陷阱? 解决方法
好的,改为上一个答案.因为从Int64到Double的隐式转换(但反之亦然),这将是表达式的结果类型.因此,当你期望得到一个盒装的Int64时,你实际上得到一个盒装的Double(但其值最初来自Int64.Parse).
如果不够清楚,让我们改变所有的返回语句,使它们只返回一个变量.这是原始代码: private static object ParseNumber(string token,FieldDefinition def) { if (def.Fraction > 0) return Double.Parse(token); else return Int64.Parse(token); } 恰当地转换: private static object ParseNumber(string token,FieldDefinition def) { if (def.Fraction > 0) { double d = Double.Parse(token); object boxed = d; // Result is a boxed Double return boxed; } else { long l = Int64.Parse(token); object boxed = l; // Result is a boxed Int64 return boxed; } } 现在让我们对带有条件运算符的版本做同样的事情: private static object ParseNumber(string token,FieldDefinition def) { return def.Fraction > 0 ? Double.Parse(token) : Int64.Parse(token); } 变 private static object ParseNumber(string token,FieldDefinition def) { // The Int64.Parse branch will implicitly convert to Double double d = def.Fraction > 0 ? Double.Parse(token) : Int64.Parse(token); object boxed = d; // *Always* a Double return boxed; } 编辑:根据要求,更多信息.表单的条件表达式的类型 X ? Y : Z 取决于Y和Z的类型,我称之为TY和TZ.有几个选择: > TY和TZ是相同的类型:结果是那种类型 这有帮助吗? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |