首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【译】尝试使用Nullable Reference Types

这是我们添加一些新属性以允许您在编译器中进行可空分析影响的地方。 T?的问题 你想知道:为什么在指定可以用可空引用或值类型替换的泛型类型时“只”允许T?。不幸的是,答案很复杂。 通常T?...可以为Null的值类型映射到.NET中的具体类类型。所以int?实际上是Nullable。但是string?,它实际上是相同的,string有一个编译器生成的属性来注解它。...您可能希望在一个方向上允许可以为空的类型(例如,仅作为输入或输出),并且不可以用notnull或t和t?表达。除非人为地为输入和输出添加单独的泛型类型,否则就需要拆分。...8: } 第一个方法指定返回的T可以是空值。这意味着此方法的调用方在使用其结果时必须检查是否为空。 第二个方法有一个更复杂的签名:[NotNull] ref T[]? 数组。...所以这个方法签名完成了我想要表达的。 但是,如果路径不为空,我们希望确保始终返回一个字符串。也就是说,我们希望getFileName的返回值不为空,以路径为空为条件。这是无法表达的。

3.8K10

C# 8.0 的可空引用类型,不止是加个问号哦!你还有很多种不同的可空玩法

你可能会好奇,C# 语言的可空特性为什么在编译成类库之后,依然可以被引用它的程序集识别。...这些古老的框架中没有这些新出来的类型,为什么也可以携带类型的可空特性呢? 实际上反编译一下编译出来的程序集就能立刻看到结果了。...在早期 .NET Framework 或者早期版本的 .NET Core 中使用 在本文第一小节里面,我们说 Nullable 是编译到目标程序集中的,所以不需要引用什么特别的程序集就能够使用到可空引用的特性...Walterlv.NullableAttributes 微软 .NET 官方的可空特性在这里: NullableAttributes.cs 我将其注释翻译成中文之后,也写了一份在这里: Walterlv.Packages...最终你输出的程序集是不带对此包的依赖的,详见: .NET 将多个程序集合并成单一程序集的 4+3 种方法 - walterlv ---- 参考资料 Upgrade APIs for nullable reference

1.5K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    可空值类型

    NullableT>的一个早期版本如下所示: public struct NullableT> where T : struct 空值类型 { private...诸如C++/CLI这样的语言,则允许开发人员对装箱前后的类型加以区分。 然而可空值类型并没有直接对等的装箱类型。...在实际编码中,我一贯使用?写法,不过不同的团队或许有不同的编码习惯。由于?在文字内容中会引起歧义,因此之后我只在代码中使用?符号,其他地方仍使用NullableT>。...转换 前面讲过,存在从T到NullableT>的隐式类型转换,以及从NullableT>到T的显式类型转换。此外,C#语言还允许链式转换。...y)false 该表中最让人不解的应该是最后一行:为什么null值小于等于另外一个null值,其结果会是false呢?而且第7行显示二者相等的命题为真。

    2.3K30

    @NotNull注解引出的关于Java空指针的控制

    因为equal()方法是对称的,调用a.equal()是同等于调用b.equal(),和这就是为什么很多部注意对象a和b,如果空的一边被调用会到导致空指针。...通过返回一个空的collection或者一个空的array可以确定像size(),length()这种基础的调用不会抛出NullPointException。...5)使用@NotNull和@Nullable注释 当写你可以定义关于约定可空性(Nullability),要通过使用像@NotNull和@Nullable类似的注释提示这个方法是否为空安全(null safe...这些注释也是JSR 305(译者注:可以理解为java的标准)的一部分。通过看到@NotNull和@Nullable,程序猿可以自己决定是否去进行空检查。...如果你不允许创建不完整的对象和否定任何这种要求,你可以预防很多一段时间之后发生的NullPointException。如果对象被允许创建,那么你应该设定合理的默认值。

    1.9K00

    C# int? 关键字

    表示一个int类型,且该int类型可空,如果不加?的话,那么int类型的默认值为0,不能赋null值,代码如下: int aa = null; (2)、当给一个变量定义成int?...(Nullable) Nullable是.NET 2.0中新提供的一种用于标记一个值类型是否可以为空的技术。...对于一个类型,我们既可以给它赋一个值,也可以给它分配一个空引用,我们就说这个类型是可空的,因此: (1)、类似string的引用类型就是可空类型 (2)、像int32等的值类型就不是可空类型,因为它们不能赋...(2)、语法 T? 是 System.NullableT> 的简写,此处的 T 为值类型。这两种形式可以互换。 (3)、为可空类型赋值与为一般值类型赋值的方法相同,如 int?...运算符分配默认值,当前值为空的可空类型被赋值给非空类型时将应用该默认值,如 int? x = null; int y = x ?? -1; (10)、不允许使用嵌套的可空类型。

    991100

    .NET中可空值类型实现原理

    为了让.Net中的值类型可以赋值为null,微软特地添加了NullableT>类型,也可简写为T?。但是NullableT>自身是结构体,也是值类型,那么它是如何实现将null赋值给值类型的呢?...下面通过自定义一个可空值类型来讲解NullableT>的实现原理。...} } 一个可空值类型的结构体大致功能已经定义好了,下面我们来创建可空值类型的实例来验证下。...换句话说,NullableT>只是在逻辑层面上实现了把null赋值给值类型,给我们一种值类型可为null的感觉。 最后说下可空值类型的装箱与拆箱。...拆箱时,对于null则返回一个NullableT>()实例,对于一个具体的数值,如5,则返回NullableT>(5)实例。 版权声明 本文为作者原创,版权归作者雪飞鸿所有。

    1K20

    一文搞定泛型知识

    敬告:本篇文章是我原创所写,首发于 51CTO 技术网站,未经本人授权任何网站、公众号、App 不允许转载,授权的网站、公众号、App 需明确标识本篇文章首发地址。...泛型在 .NET 中应用尤其广泛,泛型是在 .NET 2.0 CLR 中的增加的一项新功能,类似于 C++ 的模板但不如 C++ 的模板灵活,不过也有一些自己的特性。...一、当 C# 没有泛型 在 .NET 2.0 以前没有泛型的时候,开发人员一直在使用 System.Collections.Stack 类,它是一个栈类型的集合对象。...嵌套泛型类型的外层也是一个泛型类型,外层的这个泛型类型通常被称为包容泛型类型,嵌套泛型类型会自动获得包容泛型类型的类型参数,这段话有些绕口,我详细讲解一下。...因为可空值类型是作为泛型 NUllable 来实现的,并且 NUllable 中的 T 使用的是 struct 约束。

    1K10

    .NET WebAPI 自定义 NullableConverter 解决可为空类型字段入参“”空字符触发转换异常问题

    最近在项目中启用了Nullable 可为空的类型,这个特性确实很好用,在 WebAPI 的入参上可以直接采用 ?...来标记一个字段是否允许为空,但是使用过程中遇到了如下一个问题,比如创建部门接口 我们定义入参模型如下: public class DtoDepartment { /// ...ParentId { get; set; } } 我们这里将上级部门ID定义为可以为空的类型,因为有些部门不存在上级部门 然后定义这样一个接口 [HttpPost("CreateDepartment"...Path: $.parentId | LineNumber: 2 | BytePositionInLine: 16." } 像这样的情况是因为虽然我们定义的 Dto 允许上级部门ID字段为空,但是前端调用的时候...这样前端在调用接口时配到这类型的字段,传 "" 和 null 我们后端就都可以接收了,收到之后字段的值都是 null 我这里项目采用的是微软的 System.Text.Json 处理的 Json 序列化

    79040

    NET 隐藏构造函数的 n 种方法(Builder Pattern 构造器模式)

    然而还有更多奇怪的方式来隐藏你类的构造方法。 ---- 为什么要隐藏构造函数? 有些类型,只有组件的设计者才知道如何正确创建其类型的实例,多数开发者都无法正确将其创建出来。...在维基百科中对它适用性的描述为: 在以下情况使用生成器模式: 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时; 当构造过程必须允许被构造的对象有不同的表示时。...[System.Runtime.Versioning.NonVersionable] public static implicit operator NullableT>(T value) {...T(NullableT> value) { return value.Value; } 于是我们可以考虑写一个神奇的类,其创建是通过隐式转换来实现的: Fantastic fantastic...ERMail/Scope.cs 关于运算符重载的更多内容,可以参考我的另外两篇文章: C# 中那些可以被重载的操作符,以及使用它们的那些丧心病狂的语法糖 - walterlv C# 空合并操作符(??)

    63800

    C# 可空类型

    如何使用 可空类型允许将null值分配给值类型变量。可以使用 NullableT> 或 T? 的形式声明可为空的类型,其中T是所需的值类型。...以下是使用可空类型的基本方法: 使用NullableT>声明可空类型: Nullable nullableInt = null; if (nullableInt.HasValue) {..."Default Name"; bang运算符 bang运算符其实就是个感叹号,在if的布尔表达式里是用来取反的但是在可空类型中它的作用有了些变化,它允许变量被赋予一个可以为空的值。...这个操作叫做null断言操作符,它告诉编译器:“我知道这个可空类型的变量在这里绝对不是null,放心让我使用它”。 例如,如果有一个可空的整数变量 int?...这种特性是通过一个包装结构体实现的,即System.NullableT>,其中T是值类型的类型参数。 性能问题通常出现在大规模的数据处理或高性能计算中,而不太可能因为使用可空类型而引起。

    29750

    【译】C# 11 特性的早期预览

    您还可以回顾以前的版本以检查您可能忽略的功能。 在这篇文章中,我将这些有时是复杂的技术性讨论提炼成代码中每个特性的含义。 我们希望您能试用这些新的预览功能,并让我们知道您的想法。...可以对 ref 和 in 参数进行空值检查。 允许对索引器参数进行空检查,并将检查添加到 get 和 set 访问器。例如: public string this[string key!!]...参数上的语法与参数上的显式可空类型相结合,编译器将发出警告: void WarnCaseT>( string? name!!...T value1!! // Okay ) 构造函数 当您从代码中的显式空检查更改为使用空验证语法 (!!) 进行空检查时,会有一个很小但可以观察到的变化。...我们还从 .NET 运行时工作中了解到,有很多地方不适合进行检查,因此需要按参数选择退出机制。我们目前认为运行时空值检查的全局方法可能不合适,如果我们考虑使用全局方法,那将是一个不同的特性。

    1.7K60

    解决因C#8.0的语言特性导致EFCore实体类型映射的错误

    今天下午在排查一个EF问题时,遇到了个很隐蔽的坑,特此记录。...问题 使用ef执行Insert对象到某表时报错,此对象的Address为空: 不能将值 NULL 插入列 'Address',表 'dbo.xxx';列不允许有 Null 值。INSERT 失败。...于是开始排查:手动创建一个空程序集,引用EFCore,从原项目拷贝EF设计时库、DbContext和各实体类,一顿操作后竟然发现在新的程序集中生成的迁移文件是符合预期的。...通过查看EF文档了解到,可为空引用类型通过以下方式影响 EF Core 的行为: 如果禁用可为空引用类型,则按约定将具有 .NET 引用类型的所有属性配置为可选 (例如 string ) 。...原始项目是.NET 5.0升级而来的,所以项目文件中并不会包含Nullable相关的配置。 为了一行bug,好值得的一个下午呢

    35720

    官宣 .NET 6 RC (Release Candidate) 2

    这些具体的改进是本文后面讨论的模板更改的基础。您可以在.NET 6的示例中看到本节中使用的示例。我将在.NET 6的最后一个帖子中添加更多的例子。...你应该能够复制/粘贴代码从一个文件到另一个不需要CTRL-.类型以添加所需的名称空间(至少没有那么多)。如果您看到可空的警告或错误,您就知道您的代码可能在某些方面是不正确的。去除缩进还有好处。...WT.mc_id=dev 可空性 我已经更新了Program.cs,用来演示可空的引用类型。应用程序调用ListT>方法,返回一个T?,在本例中是一个可空字符串(string?)...或者ListT>.Find返回null,那么就不能够被编译. 如果没有启用nullable特性,我可能会错过这个问题,这将导致我的代码因NullReferenceException异常而崩溃。...考虑到返回可空引用类型的API, 我将它们分开(在这个人为的示例中),以便您可以看到我使用的string?

    1.1K10

    关于是否在C#中加入不可空引用类型的争论

    假设我要使用一个旧的类库,其中的函数都返回类型T,无法它是否是可空的。...或者因为我记得这是一段陈旧的代码,因此我将始终进行空检查。而在实际情况下,由于“T即代表着不可空的T”,因此我无需再进行空检查。如此一来,这段程序就会在我对空指针进行取值时崩溃。...人们也在热烈地讨论这一提议的替代方案。用户00Davo倾向于使用一种新的符号,以表示不可空类型。 我也乐于让纯粹的T类型总是代表不可空的引用,而只有T?...才能够接受空值,但这种改变对于向后兼容性来说就是一场恶梦。如果能引入一个全新的、明确的不可空引用符号,那么向后兼容性就会坚挺许多。比如使用T!符号,如何?...(我猜测这些标注应当并不具有运行时的意义,它们只会表现为某种.NET attribute,或某种其它类型的元数据?)

    1.1K50

    写一个 golang 风格的协程扩展

    , await 要么返回结果,要么抛异常,我对于这一点觉得还是有点儿不太喜欢的,尽管我们可以用一个 try...catch 来捕获异步任务的异常,但写起来还是感觉在犯错误。...为什么呢?返回结果的泛型参数需要定义为可空类型才可以。 suspend fun T> DeferredT>.awaitOrError2(): PairT?, Throwable?...平台类型 所以我们进入了一个尴尬的境地,我们想要的 Kotlin 语法本身似乎无法直接给我们了。...只是,有什么途径允许我们这么做呢? T! 平台类型。没错就是平台类型。如果返回的 result 是 T!...= result; return resultJava; } } 注意到对于 getError ,我明确用注解标注其返回值为可空,这就是告诉 Kotlin,这个可以为 null

    52210

    编写高质量代码改善C#程序的157个建议

    来确保值类型也可以为null   基元类型为什么需要为null?需要考虑以下两个场景:   1、数据库中一个int字段可以被设置为null。...类似的场景还有很多,在这里不进行更详尽的列举。在.NET2.0开始,便提供了一个额外的类型:可以为空的类型NullableT>。 ? 通过定义可以发现,它是一个结构体。...因为是结构体,所以只有值类型才可以作为“可以为空的类型”(引用类型本身可以为null)。...一个可以为空的int类型可以表示为 Nullable intA = null; 它也可以表示为 int?...当编译器发现元素ValueTemp的时候,它会自动在Tuesday=2的基础上+1,所以ValueTemp的值和Wednesday的值都是3。可见,枚举元素允许设定重复的值。

    47450

    c#的细节(一)-问号的细节

    我希望把这些整理出来,可以给初学者一个参考,也给自己一个温故知新的机会。高手就不必花时间来看了。...同时你会发现,在数据库应用上,数据库中有的字段允许取空值,在C#世界中引入nullable类型正好与之对应,,从(C#)对象映射到关系数据库对象,或者反过来,转换都是比较平滑。...为了实现Nullable数据类型转换成non-Nullable型数据,就有了一个这样的操作符”??(两个问号)“,双问号操作符意思是取所赋值??左边的,如果左边为null,取所赋值??...(单问号)“修饰符,是System.NullableT>的缩写形式,比如int?代表是可空的整形,例如:int? a = 1 或者 int? b=null。...Nullable类型具有一个HasValue的bool类型只读属性,当Nullable类型实例的该属性为true时,则表示该实例是非空实例,包含一个已知值Value,HasValue为false时,访问

    94760
    领券