具有可空值类型参数的扩展方法解析
public static class Extension { public static void Test(this DateTime? dt) { } } void Main() { var now = DateTime.Now; Extension.Test(now); // ok now.Test(); // compile time error }
我只是好奇,为什么编译器在作为扩展名调用时无法解析相同的方法?
DateTime
不能显式转换为 Nullable
。
C#规范,7.6.5.2扩展方法调用:
在以下情况下,扩展方法符
…
如果在任何封闭的名称空间声明或编译单元中找不到候选集,则会发生编译时错误。
因此,您必须显式地将DateTime
为Nullable
或者从头开始使用可为空的:
DateTime now = DateTime.Now; ((DateTime?)now).Test();
要么
DateTime? now = DateTime.Now; now.Test();
正如蒂姆所说,可以为空
固定:
public static class Extension { public static void Test(this DateTime? dt) { } } public class Program { private void Main() { DateTime? now = DateTime.Now; Extension.Test(now); now.Test(); } }
var
不是一种类型。 实际类型在编译时计算出来。 如果为var
设置DateTime.Now
,它将识别为DateTime
类型,而不是Nullable
,这就是它无法编译的原因。
var
变量也称为隐式类型局部变量(C#编程指南)
顺便说一句,您还可以为可空类型创建通用扩展方法:
public static T? GenericMethod(this T? source) where T : struct { //Do something }
你可以调用任何可以为空的东西,声明它的类型:
DateTime? dateTimeNullable = DateTime.Now; dateTimeNullable.GenericMethod(); int? intNullable = 0; intNullable.GenericMethod();
因为你为DateTime?
写了一个扩展名DateTime?
而不是DateTime
。
DateTime? now = DateTime.Now; Extension.Test(now); // ok now.Test(); // no compile time error
要么
var now = new DateTime?(DateTime.Now); Extension.Test(now); // ok now.Test(); // no compile time error
将工作。
你现在需要创建你的变量,其中corret类型为nullable,如下所示:
上述就是C#学习教程:具有可空值类型参数的扩展方法解析分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
DateTime? dateTime = DateTime.Now; dateTime.Test();
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1030143.html