System.Nullable null * int值的值是多少?

请考虑以下声明:

int? v1 = null; int? v2 = 5 * v1; 

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

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

它是null

C#语言规范3.0(第7.2.7节:提升运算符)

对于二元运算符+ - * / % & | ^ << >>

如果操作数和结果类型都是非可空值类型,则存在提升forms的运算符。 提升forms是通过添加一个? 每个操作数和结果类型的修饰符。 如果一个或两个操作数为null则提升的运算符产生null (例外是bool?类型的&|运算符,如第7.10.3节中所述)。 否则,提升的运算符解包操作数,应用基础运算符,并包装结果。


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

这不是无效的操作。 它不会抛出exception,因此在这种情况下您不需要处理exception。

如果希望编译器阻止该操作,请使第二个变量不可为空。 然后你将被迫写:

 int v2 = 5 * v1.Value; 

如果v1为null,这将在运行时抛出exception。

它的值将为“null”,在此上下文中至少可以认为与数据库null相同,即不是Nothing,或者Zero,它意味着“未知”。 五批Unknown仍然是Unknown,它也永远不会是“空字符串”,因为你处理的是数字,而不是字符串。

我不确定你的意思是“如何阻止编译器将其标记为无效操作?” 因为这段代码在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; }