C#7中“throw”表达式的编译时类型是什么?

C#7中“throw”表达式的编译时类型是什么?,第1张

概述在C#7中,可以在表达式中引发异常: int n = list != null ? list.Count : throw new NullReferenceException("list"); 在此位置,throw表达式可以替换任何类型的表达式. 现在我想定义一个在引发异常之前执行某些 *** 作的函数: ??? DoSomethingAndThrowException(Exception e){ 在C#7中,可以在表达式中引发异常:

int n = List != null ? List.Count : throw new NullReferenceException("List");

在此位置,throw表达式可以替换任何类型的表达式.

现在我想定义一个在引发异常之前执行某些 *** 作的函数:

??? DoSomethingAndThrowException(Exception e){    MessageBox.Show("Prepare for an exception!");    throw e;}

这样的函数的返回类型是什么,因此它可以在原始throw表达式的相同位置使用:

int n = List != null ? List.Count : DoSomethingAndThrowException(new NullReferenceException("List"));

可以选择将其声明为通用方法:

T DoSomethingAndThrowException<T>(Exception e) {...}

但这似乎很麻烦,因为泛型类型不会出现在函数体的任何地方.这是唯一的方法吗,或者是否有一些我不知道的类型,并且可以分配给任何类型(可以这么说是“反对象”类型)?

解决方法 你所谈论的类型被称为 the bottom type,所有类型的子类型,而不是 the top type,所有类型的超类型.

如您所述,C#中的顶级类型称为对象*.另一方面,C#没有底部类型(尽管有a proposal to add it).

虽然实际上有一种类型具有对任何其他类型的隐式转换:动态.这意味着如果将DoSomethingAndThrowException的返回类型设置为dynamic,则代码将被编译.但我不认为动态是一个很好的选择,因为它太具传染性了.例如,如果你在语句中使用var(var n = List!= null?List.Count:DoSomethingAndThrowException(new NullReferenceException(“List”));),那么n的类型将是动态的,包含所有行李带来的.

我认为这意味着您的结论是正确的:仿制药是您的最佳选择.

*从技术上讲,object不是顶级类型,因为object不是指针类型的超类型.但我认为这是一个无关紧要的区别.

总结

以上是内存溢出为你收集整理的C#7中“throw”表达式的编译时类型是什么?全部内容,希望文章能够帮你解决C#7中“throw”表达式的编译时类型是什么?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1217760.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存