簡體   English   中英

“解構賦值需要右側類型的表達式”

[英]"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)

編譯器可能無法決定它應該使用的MemberExpressionMethodCallExpression的共同祖先。

即使是這樣一個簡單的“提示”,

((object)mexpr, mexpr.Expression),

或者:

((Expression)mexpr, mexpr.Expression),

這樣編譯器就不需要找到共同的祖先,解決了這個問題。

代替(null, null) ,使用(default(object), default(Expression))以幫助編譯器猜測右側表達式的類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM