考虑以下陈述:
int? v1 = null;
int? v2 = 5 * v1;
的价值是 v2
多少?(null
或空字符串?)
如何防止编译器将其标记为无效操作?我需要遵循自定义异常处理吗?
考虑以下陈述:
int? v1 = null;
int? v2 = 5 * v1;
的价值是 v2
多少?(null
或空字符串?)
如何防止编译器将其标记为无效操作?我需要遵循自定义异常处理吗?
是null
。
C# 语言规范 3.0(第 7.2.7 节:提升的运算符)
对于二元运算符
+
-
*
/
%
&
|
^
<<
>>
:如果操作数和结果类型都是不可为空的值类型,则存在运算符的提升形式。提升形式是通过向每个操作数和结果类型添加单个
?
修饰符来构造的。如果一个或两个操作数是,则提升的运算符会产生一个null
null
值(一个例外是类型的&
and|
运算符bool?
,如 §7.10.3 中所述)。否则,提升的运算符解开操作数,应用底层运算符,并包装结果。
如何防止编译器将其标记为无效操作?我需要遵循自定义异常处理吗?
这不是无效操作。它不会抛出异常,因此在这种情况下您不需要处理异常。
如果您希望编译器阻止该操作,请使第二个变量不可为空。然后你将被迫写:
int v2 = 5 * v1.Value;
如果 v1 为空,这将在运行时引发异常。
它的值将是“null”,在这种情况下,至少可以认为与数据库null 相同,即,而不是Nothing,或零,它意味着“未知”。五批未知仍然是未知的,它也永远不会是“空字符串”,因为你处理的是数字,而不是字符串。
我不确定“如何防止编译器将其标记为无效操作?”是什么意思?因为这段代码在 Visual Studio 2008 下对我来说编译和运行良好 =)
我不确定您要做什么,但是如果您希望 v2 在 v1 为空时为空,那么您应该在使用之前测试 v1 是否具有值。
int? v2 = v1.HasValue ? 5 * v1.Value : null;
或者
int? v2 = null;
if (v1.HasValue) { v2 = 5 * v1.Value; }