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