当前位置: 首页 > 编程语言 > C#

带可空值类型参数的扩展方法分析与分享

时间:2023-04-10 19:11:24 C#

带可空值类型参数的扩展方法分析publicstaticclassExtension{publicstaticvoidTest(thisDateTime?dt){}}voidMain(){var现在=DateTime.Now;扩展.测试(现在);//现在好了.Test();//编译时错误}我很好奇为什么编译器在作为扩展调用时无法解析相同的方法?DateTime不能显式转换为Nullable。C#规范,7.6.5.2扩展方法调用:扩展方法说明符...如果在任何封闭的命名空间声明或编译单元中找不到候选集,则会发生编译时错误。因此,您必须显式地将DateTime设置为Nullable或从头开始使用Nullable:DateTimenow=DateTime.Now;((DateTime?)now).Test();或日期时间?现在=DateTime.Now;现在。测试();正如Tim所说,可为空固定:publicstaticclassExtension{publicstaticvoidTest(thisDateTime?dt){}}publicclassProgram{privatevoidMain(){DateTime?现在=DateTime.Now;扩展.测试(现在);现在.测试();}}var不是一种类型。实际类型是在编译时计算的。如果您为var设置DateTime.Now,它将被识别为DateTime类型,而不是Nullable,这就是它无法编译的原因。var变量也称为隐式类型局部变量(C#编程指南)顺便说一句,您还可以为可空类型创建通用扩展方法:publicstaticT?GenericMethod(thisT?source)whereT:struct{//Dosomething}你可以调用任何可为空的东西,声明它的类型:DateTime?dateTimeNullable=DateTime.Now;dateTimeNullable.GenericMethod();诠释?intNullable=0;intNullable.GenericMethod();因为你为DateTime写作?添加了扩展日期时间?而不是日期时间。约会时间?现在=DateTime.Now;扩展.测试(现在);//现在好了.Test();//没有编译时错误或varnow=newDateTime?(DateTime.Now);扩展.测试(现在);//现在好了.Test();//没有编译时错误会起作用。你现在需要创建你的变量,其中corret类型为nullable,如下图:以上是C#学习教程:扩展方法带nullable值类型参数分析分享所有内容,如果对大家有用需要了解更多关于C#学习教程,希望大家多多关注——DateTime?dateTime=DateTime.Now;日期时间.测试();如需转载请注明出处: