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
相关产品推荐
相关产品推荐

