考虑以下陈述:

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相同,即而不是什么,而不是零,则表示“未知”。五个未知数仍然未知,当您处理数字而不是字符串时,它也永远不会是“空字符串”。

我不确定您的意思是“如何防止编译器将其标记为无效的操作?”由于此代码编译并在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归因
不隶属于 StackOverflow
scroll top