You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#代码if语句中is类型匹配编译报错,请求排查解决

问题:C#模式匹配语法引发编译器报错

报错信息

Line: 37 - ) expected
Line: 37 - ; expected
Line: 37 - Invalid expression term ')'
Line: 37 - ; expected

报错代码行

if (ex is Avalara.AvaTax.RestClient.AvaTaxError avaTaxError)

完整代码

using System;
using SAPbobsCOM;
using SAPbouiCOM;
using Avalara.AvaTax.RestClient;
namespace B1UPCODE 
{ 
    public class B1UPCLASS 
    { 
        public void DynamicCode(params object[] parameters) 
        { 
            SAPbobsCOM.Company company = (SAPbobsCOM.Company)parameters[0];
            SAPbouiCOM.Application application = (SAPbouiCOM.Application)parameters[1];
            SAPbouiCOM.Form form = (SAPbouiCOM.Form)parameters[2];
            SBO.UI.B1Form eventForm = (SBO.UI.B1Form)parameters[3];
            UniversalFunctions.Model.CommonEventObject eventData = (UniversalFunctions.Model.CommonEventObject)parameters[4];
            SBO.AddonLogic.AddonData addonData = (SBO.AddonLogic.AddonData)parameters[5];
            var Client =    new AvaTaxClient("Whatever I want to call the client", "1.0", Environment.MachineName, AvaTaxEnvironment.Production)
                            .WithSecurity("MyUsername", "MyPassword");
                 
            // Verify that we can ping successfully
            var pingResult = Client.Ping();
            if ((bool)pingResult.authenticated)
            {
                application.StatusBar.SetText("Ping success", SAPbouiCOM.BoMessageTime.bmt_Short, SAPbouiCOM.BoStatusBarMessageType.smt_Success);

                try
                {
                    // Create a simple transaction for $100 using the fluent transaction builder
                    var transaction = new TransactionBuilder(Client, "DEFAULT", DocumentType.SalesInvoice, "9999")
                    .WithAddress(TransactionAddressType.SingleLocation, "255 S King St", null, null, "Seattle", "WA", "98104", "US")
                    .WithLineItem(100.0m, 1, "P0000000")
                    .Create();
                }
                catch(Exception ex)
                {

                    if (ex is Avalara.AvaTax.RestClient.AvaTaxError avaTaxError)
                    {
                        // Print the error status code (e.g. "BadRequest", "Unauthorized", etc.)
                        application.StatusBar.SetText("AvaTax Error Type: " + avaTaxError.statusCode, SAPbouiCOM.BoMessageTime.bmt_Short, SAPbouiCOM.BoStatusBarMessageType.smt_Error);
                        // Print the error message returned by AvaTax
                        application.StatusBar.SetText("AvaTax Error Message: " + avaTaxError.error.error.message.ToString(), SAPbouiCOM.BoMessageTime.bmt_Short, SAPbouiCOM.BoStatusBarMessageType.smt_Error);

                        // Print the error details for each error encountered
                        application.StatusBar.SetText("AvaTax Error Details:", SAPbouiCOM.BoMessageTime.bmt_Short, SAPbouiCOM.BoStatusBarMessageType.smt_Error);

                        foreach (var detail in avaTaxError.error.error.details)
                        {
                            // Print the description and help link for each error
                            application.StatusBar.SetText(" Description: " + detail.description, SAPbouiCOM.BoMessageTime.bmt_Short, SAPbouiCOM.BoStatusBarMessageType.smt_Error);
                            application.StatusBar.SetText(" Help Link: " + detail.helpLink, SAPbouiCOM.BoMessageTime.bmt_Short, SAPbouiCOM.BoStatusBarMessageType.smt_Error);
                        }

                        // Print the full error response received from AvaTax
                        application.StatusBar.SetText("Full Error Response: " + avaTaxError.error.error.ToString(), SAPbouiCOM.BoMessageTime.bmt_Short, SAPbouiCOM.BoStatusBarMessageType.smt_Error);

                    }
                }
            }
            else
            {
            application.StatusBar.SetText("Ping fail", SAPbouiCOM.BoMessageTime.bmt_Short, SAPbouiCOM.BoStatusBarMessageType.smt_Error);
            }
        } 
    } 
}

尝试的错误修改

if (ex is Avalara.AvaTax.RestClient.AvaTaxError)
{
    var (Avalara.AvaTax.RestClient.AvaTaxError) avaTaxError;

解决方案

根本原因

你使用的if (ex is 类型 变量)语法是C# 7.0引入的模式匹配特性,如果项目的C#语言版本低于7.0,编译器无法识别该语法,就会抛出上述报错。

方案1:升级项目C#版本

打开项目属性 → 生成 → 高级 → 语言版本,选择C# 7.0及以上版本(推荐选择兼容的最高版本,比如C# 7.3或C# 8.0)。

方案2:改用旧版本兼容写法

将模式匹配语法拆分为类型检查+安全转换,替换原有的if语句:

catch(Exception ex)
{
    Avalara.AvaTax.RestClient.AvaTaxError avaTaxError = ex as Avalara.AvaTax.RestClient.AvaTaxError;
    if (avaTaxError != null)
    {
        // 原有错误处理代码保持不变
        application.StatusBar.SetText("AvaTax Error Type: " + avaTaxError.statusCode, SAPbouiCOM.BoMessageTime.bmt_Short, SAPbouiCOM.BoStatusBarMessageType.smt_Error);
        application.StatusBar.SetText("AvaTax Error Message: " + avaTaxError.error.error.message.ToString(), SAPbouiCOM.BoMessageTime.bmt_Short, SAPbouiCOM.BoStatusBarMessageType.smt_Error);
        application.StatusBar.SetText("AvaTax Error Details:", SAPbouiCOM.BoMessageTime.bmt_Short, SAPbouiCOM.BoStatusBarMessageType.smt_Error);

        foreach (var detail in avaTaxError.error.error.details)
        {
            application.StatusBar.SetText(" Description: " + detail.description, SAPbouiCOM.BoMessageTime.bmt_Short, SAPbouiCOM.BoStatusBarMessageType.smt_Error);
            application.StatusBar.SetText(" Help Link: " + detail.helpLink, SAPbouiCOM.BoMessageTime.bmt_Short, SAPbouiCOM.BoStatusBarMessageType.smt_Error);
        }

        application.StatusBar.SetText("Full Error Response: " + avaTaxError.error.error.ToString(), SAPbouiCOM.BoMessageTime.bmt_Short, SAPbouiCOM.BoStatusBarMessageType.smt_Error);
    }
}

错误修改说明

var关键字用于隐式类型推断,不能和显式类型一起使用。如果要强制转换,正确写法是:

var avaTaxError = (Avalara.AvaTax.RestClient.AvaTaxError)ex;

但这种方式在ex不是目标类型时会抛出异常,不如as运算符安全(转换失败返回null,不会抛异常)。


内容的提问来源于stack exchange,提问作者CactusCake

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 05:15:03