问题标签 [nullable]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
621 浏览

c# - 可为空的变量类型 - .value 成员

我想知道 - 我什么时候想在可空类型上使用 .Value 成员,而不仅仅是调用变量本身?

例如。

布尔?b = 真;

为什么我要使用 b.Value 而不是只使用 b 来获取值?.Value 调用增加了什么优势或功能?

0 投票
4 回答
14254 浏览

vb.net - 在 vb.net 中是否有可以为空的 bool 之类的东西

我正在阅读我的新 MVC 书,当然,这些示例都像往常一样在 c# 中。

有一行代码说

作者解释说,问号表示这是一个可空(三态)布尔值,可以为真,也可以为假。或为空。(新的 C# 3 约定。)

vb.net 是否支持任何这样的约定。当然,我可以在 vb.net 中声明一个布尔值,并且可以将其显式设置为 Null(vb.net 中为空)。

有什么不同。在 c# 中还有更多内容吗?优点?

0 投票
2 回答
264 浏览

.net - 我是否必须对 Nullable 类型的属性进行验证?

我正在创建一个自定义配置部分(继承 System.Configuration.ConfigurationSection),我想知道是否必须对一个可为 Nullable int 的 ConfigurationProperty 进行值验证。即,我是否必须这样做:

或者我可以做这样的事情:

或者有没有更好的方法?

提前致谢。

0 投票
3 回答
2079 浏览

vb.net - VB.NET 3.5;编译器用“错误 BC30037:字符无效”来抱怨可空类型(如 Double?)。

Visual Studio 刚刚开始向我扔“ error BC30037: Character is not valid.”(在验证网站时),无论我在我的 VB.NET 3.5 项目中的任何地方使用可空运算符的任何地方。这发生在几个月前的一位同事身上,但他不记得他是如何解决的。

例如,如果我更改Double?to的每个实例Nullable(Of Double),它编译得很好,并且在同一解决方案中的其他项目中的其他可空值用法继续正常工作。

我尝试清理解决方案,关闭 Visual Studio,删除临时 ASP.NET 文件,然后重新启动 Visual Studio 无济于事。

还有什么我可以尝试的吗?

添加:

我想我会提到委托语法也失败了。我有这段代码:

payments是一个IList(Of Payment)。该Payment对象有一个名为 的字符串属性Code。Visual Studio 中没有任何验证错误或任何可见的东西,使它认为它不知道那行代码的作用。Intellisense 工作得很好,但编译器符合语法。上面两行代码分别伴随以下两个错误:

似乎 Visual Studio 不知道它应该知道的 VB.NET 3.5 特性。

0 投票
5 回答
270 浏览

c#-3.0 - 有没有更好的方法在 C#3.0 中编写这行 C# 代码?

我有一个声明如下的属性:

我需要将此值作为字符串传递给另一个方法,因此我看到的唯一方法如下:

当您将许多类似的属性传递给方法时,这看起来非常混乱。

有谁知道是否有更好,更简洁的写法?

哦,如果有人能想到这个问题的更合适的标题,请随时更改它......

0 投票
5 回答
699 浏览

vb.net - 看不到声明为可为空的结构的成员

在 VB.NET 中,为什么当我将结构的成员设置为可为空的类型时,我看不到它的成员?

例子:

0 投票
2 回答
47210 浏览

c# - C# 代码无法编译。null 和 int 之间没有隐式转换

可能重复:
可空类型和三元运算符:为什么是`?10:null`禁止?

为什么这不起作用?似乎是有效的代码。

我应该如何编码?该方法采用 Nullable。如果下拉选择了一个字符串,我需要将其解析为一个 int 否则我想将 null 传递给该方法。

0 投票
4 回答
3911 浏览

c# - 序列化可空类型的正确方法是什么?

我正在我的一个类中实现 IXMLSerializable。它包含一些可以为空的数字属性(int?double?等)

通过 IXMLSerializable 序列化/序列化这些的正确方法是什么?这就是我现在正在做的事情,它有效,但显然似乎不是正确的方法。

更新: 有人问我为什么要实现IXmlSerializable的背景知识。我正在开发一个建筑设计程序,我需要一个代表楼层集合的类。每个楼层都具有诸如Floor.Area面积、Floor.Height等属性。但是,楼层的标高由其下方楼层高度的总和定义。因此,每当Floor.Height属性更改或FloorCollection被修改时,都会重新计算Floors的高度。

我需要序列化的FloorCollection类继承自 BindingList。如果我尝试直接序列化此类,它将序列化楼层的集合,但不会序列化类中的任何属性或字段。请参阅我之前的帖子

现在我正在尝试添加限制集合中建筑物楼层的最大高度、最大顶部标高和最小底部标高的功能。所以我使用可为空的双精度来表示这些限制,其中空值表示不受限制。高程属性可以是正数、负数或零。因此,需要有一个备用状态 null 来标识何时没有限制。

现在我想,如果有一个单独的布尔值来标识是否存在海拔/高度限制,然后有一个常规的双属性来标识启用它的限制是什么,总体上可能会更容易。

0 投票
5 回答
64859 浏览

.net - 使用 XmlSerializer 将空 xml 属性值反序列化为可为空的 int 属性

我从第 3 方获得了一个 xml,我需要将其反序列化为 C# 对象。此 xml 可能包含值为整数类型或空值的属性:attr=”11” 或 attr=””。我想将此属性值反序列化为可空整数类型的属性。但 XmlSerializer 不支持反序列化为可空类型。以下测试代码在创建 XmlSerializer 期间失败,并出现 InvalidOperationException {“反映类型‘TestConsoleApplication.SerializeMe’的错误。”}。

当我将“Value”属性的类型更改为 int 时,反序列化失败并出现 InvalidOperationException:

XML 文档 (1, 16) 中存在错误。

任何人都可以建议如何将具有空值的属性反序列化为可空类型(作为空),同时将非空属性值反序列化为整数?这有什么技巧,所以我不必手动对每个字段进行反序列化(实际上有很多)?

ahsteele 发表评论后更新:

  1. Xsi:nil 属性

    据我所知,此属性仅适用于 XmlElementAttribute - 此属性指定元素没有内容,无论是子元素还是正文。但我需要找到 XmlAttributeAttribute 的解决方案。无论如何,我无法更改 xml,因为我无法控制它。

  2. bool *指定属性

    此属性仅在属性值非空或缺少属性时有效。当 attr 具有空值 (attr='') 时,XmlSerializer 构造函数将失败(如预期的那样)。

    /li>
  3. 自定义 Nullable 类,如 Alex Scordellis 的这篇博客文章

    我尝试将这篇博客文章中的课程用于我的问题:

    但 XmlSerializer 构造函数因 InvalidOperationException 而失败:

    无法序列化 TestConsoleApplication.NullableInt 类型的成员“值”。

    XmlAttribute/XmlText 不能用于编码实现 IXmlSerializable 的类型}

  4. 丑陋的替代解决方案(我很惭愧我在这里写了这段代码:)):

    但我不想想出这样的解决方案,因为它破坏了我的类对其消费者的接口。我最好手动实现 IXmlSerializable 接口。

目前看来我必须为整个 Element 类(它很大)实现 IXmlSerializable 并且没有简单的解决方法......</p>

0 投票
4 回答
10272 浏览

mysql - MySQL ON DUPLICATE KEY UPDATE 与唯一键中的可为空列

我们的 MySQL 网络分析数据库包含一个汇总表,该汇总表在导入新活动时全天更新。我们使用 ON DUPLICATE KEY UPDATE 以便汇总覆盖之前的计算,但由于汇总表的 UNIQUE KEY 中的列之一是可选的 FK,并且包含 NULL 值,因此遇到了困难。

这些 NULL 旨在表示“不存在,并且所有此类情况都是等效的”。当然,MySQL 通常将 NULL 视为“未知,并且所有这些情况都不等价”。

基本结构如下:

一个“活动”表,其中包含每个会话的条目,每个条目都属于一个活动,以及一些条目的可选过滤器和事务 ID。

一个“摘要”表,其中包含活动表中会话总数的每日汇总,以及包含事务 ID 的那些会话的总数。这些摘要是分开的,每个活动和(可选)过滤器的组合都有一个。这是一个使用 MyISAM 的非事务表。

实际的汇总查询如下所示,计算会话和事务的数量,然后按活动和(可选)过滤器分组。

一切都很好,除了 filter_id 为 NULL 的情况的摘要。在这些情况下,ON DUPLICATE KEY UPDATE 子句与现有行不匹配,并且每次都会写入新行。这是由于“NULL!= NULL”这一事实。然而,在比较唯一键时,我们需要的是“NULL = NULL”。

我正在寻找解决方法的想法或对我们迄今为止提出的问题的反馈。到目前为止,我们已经想到的解决方法如下。

  1. 在运行汇总之前删除所有包含 NULL 键值的汇总条目。(这就是我们现在正在做的事情)如果在汇总过程中执行查询,这会产生负面影响,即返回缺少数据的结果。

  2. 将 DEFAULT NULL 列更改为 DEFAULT 0,这允许 UNIQUE KEY 一致地匹配。这具有使针对汇总表的查询开发过于复杂的负面影响。它迫使我们使用大量的“CASE filter_id = 0 THEN NULL ELSE filter_id END”,并且由于所有其他表的 filter_id 都具有实际的 NULL,因此连接起来很尴尬。

  3. 创建一个返回“CASE filter_id = 0 THEN NULL ELSE filter_id END”的视图,并直接使用此视图而不是表。汇总表包含几十万行,我被告知视图性能很差。

  4. 允许创建重复条目,并在汇总完成后删除旧条目。与提前删除它们有类似的问题。

  5. 添加一个包含 0 表示 NULL 的代理列,并在 UNIQUE KEY 中使用该代理项(实际上,如果所有列都不是 NULL,我们可以使用 PRIMARY KEY)。
    这个解决方案似乎是合理的,只是上面的例子只是一个例子;实际的数据库包含六个汇总表,其中一个在 UNIQUE KEY 中包含四个可为空的列。有些人担心开销太大。

您是否有更好的解决方法、表结构、更新过程或 MySQL 最佳实践可以提供帮助?

编辑:澄清“空的含义”

包含 NULL 列的汇总行中的数据仅在汇总报告中作为单个“包罗万象”行的意义上被认为属于一起,汇总了该数据点不存在或未知的那些项目。因此,在汇总表本身的上下文中,含义是“那些不知道值的条目的总和”。另一方面,在关系表中,这些确实是 NULL 结果。

将它们放入汇总表上的唯一键的唯一原因是在重新计算汇总报告时允许自动更新(通过 ON DUPLICATE KEY UPDATE)。

也许更好的描述方式是通过具体示例,其中一个汇总表按地理区域按受访者提供的公司地址的邮政编码前缀分组结果。并非所有受访者都提供了营业地址,因此事务和地址表之间的关系是非常正确的 NULL。在此数据的汇总表中,为每个邮政编码前缀生成一行,其中包含该区域内的数据汇总。将生成一个附加行来显示不知道邮政编码前缀的数据的摘要。

将其余数据表更改为具有显式“THERE_IS_NO_ZIP_CODE”0 值,并在 ZipCodePrefix 表中放置一个表示该值的特殊记录是不正确的——这种关系确实是 NULL。