如何在C# 12类中实现带内部异常参数的构造函数
解决C# 12主构造函数类中实现带内部异常的构造函数问题
错误原因
当类使用C# 12主构造函数(类名后直接带参数列表的语法)时,所有显式声明的自定义构造函数必须通过this(...)调用本类的构造函数(主构造函数或其他自定义构造函数),不能直接使用base(...)调用基类构造函数,这就是编译错误CS8862的触发原因。
两种正确实现方式
方式1:保留主构造函数,扩展参数覆盖场景
调整主构造函数,添加可选的innerException参数,让所有构造函数通过this(...)链到主构造函数,同时由主构造函数负责调用基类的对应构造函数:
public class TokenAcquisitionException(string message, Exception? innerException = null) : Exception(message, innerException) { private const string FailedToGetToken = "Failed to get token"; // 无参构造函数:调用主构造函数,传入默认错误消息 public TokenAcquisitionException() : this(FailedToGetToken) { } // 仅带消息的构造函数:调用主构造函数,innerException传null public TokenAcquisitionException(string message) : this(message, null) { } }
这种写法既保留了主构造函数的简洁性,又能正确传递内部异常到基类,符合异常类的规范实现。
方式2:放弃主构造函数,使用传统构造函数写法
如果不需要主构造函数的语法糖,可以回到传统的构造函数声明方式,自由调用基类的对应构造函数:
public class TokenAcquisitionException : Exception { private const string FailedToGetToken = "Failed to get token"; public TokenAcquisitionException() : base(FailedToGetToken) { } public TokenAcquisitionException(string message) : base(message) { } public TokenAcquisitionException(string message, Exception innerException) : base(message, innerException) { } }
这种写法没有主构造函数的限制,完全遵循传统异常类的实现模式,适合习惯旧语法的开发者。
为什么之前的修改无效
你之前将base改为this(message)的写法,虽然解决了编译错误,但主构造函数只调用了Exception(message),没有把innerException传递给基类,导致最终异常对象的InnerException属性无法被正确设置,不符合需求。
内容的提问来源于stack exchange,提问作者Mavaddat Javid
相关产品推荐
相关产品推荐

