C#泛型异常抛出方法中Activator.CreateInstance可空警告:是否存在null场景?
泛型异常抛出方法的Null警告问题解答
是否存在exception为null的场景?
完全不存在。理由如下:
- 泛型约束
T : Exception确保T必然是Exception的子类,而所有Exception派生类(包括自定义异常)都遵循.NET异常规范,要么显式实现、要么继承自Exception的string参数构造函数。 Activator.CreateInstance(typeof(T), message)创建的实例本质就是T类型,后续的as T转换不可能失败,不会返回null。- 退一步说,如果自定义异常故意不实现带
string参数的构造函数,Activator.CreateInstance会直接抛出MissingMethodException,根本不会走到throw exception这一行,所以exception变量不可能为null。
修复警告而非抑制是否符合逻辑?
如果确认无null风险,用null原谅运算符!抑制警告是可行的,但更优的方式是直接强转而非as T,既能消除警告,又无需依赖抑制符,代码更清晰:
private static T ThrowException<T>(string message) where T : Exception, new() { T exception = (T)Activator.CreateInstance(typeof(T), message); throw exception; }
我们明确知道Activator.CreateInstance返回的实例就是T类型,强转是安全的,编译器会认可这一点,不会再产生null警告。
至于额外加null检查的方案,完全是冗余的——永远不会触发exception为null的分支,反而增加不必要的代码复杂度,没有必要这么做。
内容的提问来源于stack exchange,提问作者Cris
相关产品推荐
相关产品推荐

