对于 C# 7
在 C# 7 中,throw
成为一个表达式,因此可以完全使用问题中描述的代码。
对于 C# 6 及更早版本
您不能直接在 C# 6 及更早版本中执行此操作 - ?? 的第二个操作数 必须是表达式,而不是 throw 语句。
如果您真的只是想找到一个简洁的选项,则有几种选择:
你可以写:
public static T ThrowException<T>()
{
throw new Exception(); // Could pass this in
}
接着:
return command.ExecuteScalar() as int? ?? ThrowException<int?>();
不过,我真的不建议您这样做……这非常可怕且不习惯。
扩展方法怎么样:
public static T ThrowIfNull(this T value)
{
if (value == null)
{
throw new Exception(); // Use a better exception of course
}
return value;
}
然后:
return (command.ExecuteScalar() as int?).ThrowIfNull();
还有另一种选择(再次是扩展方法):
public static T? CastOrThrow<T>(this object x)
where T : struct
{
T? ret = x as T?;
if (ret == null)
{
throw new Exception(); // Again, get a better exception
}
return ret;
}
致电:
return command.ExecuteScalar().CastOrThrow<int>();
这有点难看,因为您不能指定int?
为类型参数...