![](/img/trans.png)
[英]Ternary/null coalescing operator and assignment expression on the right-hand side?
[英]"Deconstruct assignment requires an expression with a type on the right hand side"
以下代碼:
(object ret, Expression subexpr) = expr switch {
// instance member
MemberExpression mexpr when mexpr.Expression is not null =>
(mexpr, mexpr.Expression),
// instance method call
MethodCallExpression callExpr when callExpr.Object is not null =>
(callExpr, callExpr.Object),
// include instance method calls, or static extension method calls
MethodCallExpression callExpr when
callExpr.Method.GetCustomAttributes(typeof(ExtensionAttribute)).Any() &&
callExpr.Arguments.FirstOrDefault() is not null =>
(callExpr, callExpr.Arguments.First()),
_ => (null, null)
};
不編譯,有:
CS8131:解構賦值需要右側類型為的表達式。
為什么會這樣? 我該如何解決?
這似乎是“編譯器無法確定開關的類型”的簡單案例。 如果你用一個簡單的var x =
替換解構,讓編譯器找出 switch 表達式應該計算的類型,錯誤消息將變為更有用:
未找到 switch 表達式的最佳類型
您返回每個案例的元組是以下類型:
(MemberExpression, Expression)
(MethodCallExpression, Expression)
(MethodCallExpression, Expression)
編譯器可能無法決定它應該使用的MemberExpression
和MethodCallExpression
的共同祖先。
即使是這樣一個簡單的“提示”,
((object)mexpr, mexpr.Expression),
或者:
((Expression)mexpr, mexpr.Expression),
這樣編譯器就不需要找到共同的祖先,解決了這個問題。
代替(null, null)
,使用(default(object), default(Expression))
以幫助編譯器猜測右側表達式的類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.