4

考虑以下陈述:

int? v1 = null;

int? v2 = 5 * v1;

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

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

4

4 回答 4

19

null

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

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

如果操作数和结果类型都是不可为空的值类型,则存在运算符的提升形式。提升形式是通过向每个操作数和结果类型添加单个?修饰符来构造的。如果一个或两个操作数是,则提升的运算符会产生一个nullnull值(一个例外是类型的&and|运算符bool?,如 §7.10.3 中所述)。否则,提升的运算符解开操作数,应用底层运算符,并包装结果。


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

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

于 2009-08-25T12:20:44.003 回答
11

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

int v2 = 5 * v1.Value;

如果 v1 为空,这将在运行时引发异常。

于 2009-08-25T12:22:57.000 回答
1

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

我不确定“如何防止编译器将其标记为无效操作?”是什么意思?因为这段代码在 Visual Studio 2008 下对我来说编译和运行良好 =)

于 2009-08-25T12:23:40.697 回答
1

我不确定您要做什么,但是如果您希望 v2 在 v1 为空时为空,那么您应该在使用之前测试 v1 是否具有值。

int? v2 = v1.HasValue ? 5 * v1.Value : null;

或者

int? v2 = null;
if (v1.HasValue) { v2 = 5 * v1.Value; }
于 2009-08-25T12:27:23.307 回答