System.Nullable <t> null * int value的值是什么?</t>

时间:2009-08-25 12:19:34

标签: c# null operators nullable lifted-operators

考虑以下陈述:

int? v1 = null;

int? v2 = 5 * v1;

v2的价值是多少? (null或空字符串?)

如何阻止编译器将其标记为无效操作?我是否需要遵循自定义异常处理?

4 个答案:

答案 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; }