Hel*_*t D 3 c# types throw compile-time c#-7.0
在C#7中,可以在表达式中引发异常:
int n = list != null ? list.Count : throw new NullReferenceException("list");
Run Code Online (Sandbox Code Playgroud)
在此位置,throw表达式可以替换任何类型的表达式.
现在我想定义一个在引发异常之前执行某些操作的函数:
??? DoSomethingAndThrowException(Exception e)
{
MessageBox.Show("Prepare for an exception!");
throw e;
}
Run Code Online (Sandbox Code Playgroud)
这样的函数的返回类型是什么,因此它可以在原始throw表达式的相同位置使用:
int n = list != null ? list.Count : DoSomethingAndThrowException(new NullReferenceException("list"));
Run Code Online (Sandbox Code Playgroud)
可以选择将其声明为通用方法:
T DoSomethingAndThrowException<T>(Exception e) {...}
Run Code Online (Sandbox Code Playgroud)
但这似乎很麻烦,因为泛型类型不会出现在函数体的任何地方.这是唯一的方法吗,或者是否有一些我不知道的类型,并且可以分配给任何类型(可以这么说是"反对象"类型)?
你所谈论的类型被称为底部类型,所有类型的子类型,而不是顶级类型,所有类型的超类型.
如您所述,C#中的顶级类型称为object*.另一方面,C#没有底部类型(尽管有提议添加它).
虽然实际上有一种类型具有对任何其他类型的隐式转换:dynamic.这意味着如果将返回类型设置为DoSomethingAndThrowExceptionto dynamic,则代码将编译.但我不认为这dynamic是一个很好的选择,因为它太具传染性了.例如,如果你var在你的陈述(var n = list != null ? list.Count : DoSomethingAndThrowException(new NullReferenceException("list"));)中使用过,那么它的类型n就会dynamic带来所有带来的行李.
我认为这意味着您的结论是正确的:仿制药是您的最佳选择.
*从技术上讲,object它不是顶级类型,因为object它不是指针类型的超类型.但我认为这是一个无关紧要的区别.
| 归档时间: |
|
| 查看次数: |
188 次 |
| 最近记录: |