【问题标题】:Behavior of C# with Nullables带有 Nullable 的 C# 的行为
【发布时间】:2012-07-19 00:16:15
【问题描述】:

在 C#

int? a1 = 0;
int? a2 = 100;
a1 = a1 | default(int?);
a2 = a2 | default(int?);
a1 和 a2 都为空。如果有人能解释它的工作原理,那就太好了。

更新

我提出这个疯狂示例的原因是 int?被布尔取代?和绑定过程。

bool? a1 = null;
bool? a2 = true;
a1 = a1 | default(bool?);
a2 = a2 | default(bool?);

这段代码没有给出表达式的结果始终为空的警告。推断的原因是 'I_dont_know'|int = 'I_dont_know' 其中 'I_dont_know' |真 = 真

如果我错了,请纠正我

【问题讨论】:

  • 你想做什么?你期望结果是什么?你知道default(int?)的值是多少吗?你知道| 是什么意思吗?
  • 正如 Lippert 所说,“一个数字和‘我不知道’的 OR 是‘我不知道’”。
  • 可空类型(无论底层类型如何)的默认值始终为空。
  • bsoundra:您需要在更新中更加具体。指导方针:(a) 提供原始代码,(b) 提供您认为的行为,(c) 您的期望或令您困惑的内容。在 int?情况很清楚,但是可以这么说,您的更新有点混乱。我感到困惑的一个原因是我无法构造编译器将使用 bool? 接受的工作代码。所以我建议您提供详细信息,我们中的一个会帮助您:-)
  • @PrashantGupta 我做了一些修改。请看看它是否增加了清晰度。

标签: c# nullable


【解决方案1】:

这是因为以下原因..

1] default(int?) will always return 'null'
2] null | <anything> returns 'null'

http://msdn.microsoft.com/en-us/library/xwth0h0d%28v=vs.80%29.aspx

顺便说一句,Visual Studio 应该抱怨您的表达式总是解析为 null。 (警告)。

【讨论】:

  • 就像更新中提到的那样,当 int 被 bool 和 null | 替换时,这种行为会发生变化。 true 将由操作者角色的变化赋予 true 。谢谢。
【解决方案2】:

首先请注意,这与写作没有什么不同:

int? a1 = 0   | default(int?);
int? a2 = 100 | default(int?);

相当于:

int? a1 = 0   | null;
int? a2 = 100 | null;

the default keyword used on a reference type yields null。因为

<any integer> | null

总是计算为null,你有:

int? a1 = null;
int? a2 = null;

这解释了为什么两个值都是null

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-26
    • 2016-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-26
    相关资源
    最近更新 更多