![](/img/trans.png)
[英]Error converting value "null" to type 'System.Nullable`1[System.Int64]'
[英]System.Nullable<T> What is the value of null * int value?
请考虑以下陈述:
int? v1 = null;
int? v2 = 5 * v1;
v2
的价值是多少? ( null
或空字符串?)
如何防止编译器将其标记为无效操作? 我是否需要遵循自定义异常处理?
它是null
。
C#语言规范3.0(第7.2.7节:提升运算符)
对于二元运算符
+
-
*
/
%
&
|
^
<<
>>
:如果操作数和结果类型都是非可空值类型,则存在提升形式的运算符。 提升形式是通过添加一个
?
每个操作数和结果类型的修饰符。 如果一个或两个操作数为null
则提升的运算符产生null
值 (例外是bool?
类型的&
和|
运算符,如第7.10.3节中所述)。 否则,提升的运算符解包操作数,应用基础运算符,并包装结果。
如何防止编译器将其标记为无效操作? 我是否需要遵循自定义异常处理?
这不是无效的操作。 它不会抛出异常,因此在这种情况下您不需要处理异常。
如果希望编译器阻止该操作,请使第二个变量不可为空。 然后你将被迫写:
int v2 = 5 * v1.Value;
如果v1为null,这将在运行时抛出异常。
它的值将为“null”,在此上下文中至少可以认为与数据库null相同,即不是Nothing,或者Zero,它意味着“未知”。 五批未知仍然是未知的,它也永远不会是“空字符串”,因为你处理数字,而不是字符串。
我不确定你的意思是“如何阻止编译器将其标记为无效操作?” 因为这段代码在Visual Studio 2008下编译并运行正常=)
我不确定你要做什么,但如果你想v2为null,如果v1为null,那么你应该测试v1在使用之前是否有值。
int? v2 = v1.HasValue ? 5 * v1.Value : null;
要么
int? v2 = null;
if (v1.HasValue) { v2 = 5 * v1.Value; }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.