谈谈Nullable<T>的类型转换问题
本篇文章讨论可空值类型(Nullable<T>)的转换,却确地说是如何将一种类型的值对象转换成相应的可空值。这来源于今天我们的一个成员遇到的一个小问题,我经过一些整理写了这篇文章。虽然没有什么技术含量可言,也希望对某些读者带来帮助。
一、四种典型的类型转换方式对于类型转化,或者进一步地,对于像Int、Double、DateTime、String等这些原生类型之间的转化,我们具有四种典型的转换方式。如果类型之间不具有隐士转换关系存储,我们可以之间通过类型转换操作符进行显式转换,比如: 1: double doubleValue = 3.14159265; int intValue1 = Convert.ToInt32(literalValue); 最后一种常见的方法用在将基于某种具体类型的格式化字符串转化成对应的类型,我们可以调用具体类型的静态方法Parse或者TryParse实现类型的转换,比如: 3: DateTime dateTimeValue2;
5: { 7: } 二、当类型转换遭遇Nullable<T>类型Convert几乎实现所有“兼容类型”之间的转换,也可以向Parse方法一样解析具有合法格式的字符串。但是,如果目标类型换成是Nullable<T>类型的时候,类型转换将会失败。比如我们将上面第二个例子的目标类型从int换成int?(Nullable<Int32>): 3: {
5: } 7: { 9: } 类型转换错误消息会被输出: to 'System.Nullable`1[[System.Int32,mscorlib,
实际上,如果你调用Convert的ChangeType方法将任何类型对象转换成Nullable<T>类型,都会抛出出InvalidCastException异常,即使你将T类型转化成Nullable<T>。比如,我们将上面的例子中原数据类型换成int类型: int?)Convert.ChangeType(intValue1,1)" id="lnum9"> 9: }
依然会输入类似的错误信息: to 'System.Nullable`1[[System.Int32,
而实际上,T类型的对象是可以显式或者隐式转化成Nullable<T>对象的。也就是说,下面代码所表示的类型转换是没有问题的: int? intValue2 = intValue1;
public static class ConvertionExtensions 3: static T? ConvertTo<T>(this IConvertible convertibleValue) where T : struct 5: if (null == convertibleValue) 7: return null; 9: return (T?)Convert.ChangeType(convertibleValue,1)">typeof(T));
11: } 借助于上面这个扩展方法ConvertTo,对于目标类型为Nullable<T>的转换就显得很简单了: double? doubleValue = double>();
static T ConvertTo<T>(this IConvertible convertibleValue)
6: } 8: if (!typeof(T).IsGenericType) 10: return (T)Convert.ChangeType(convertibleValue,1)">typeof(T));
12: else
14: Type genericTypeDefinition = typeof(T).GetGenericTypeDefinition();
16: { 18: } 20: throw new InvalidCastException(string.Format("Invalid cast from type "{0}" to type "{1}".",convertibleValue.GetType().FullName,1)">typeof(T).FullName)); int intValue1 = int? intValue2 = int?>(); 4: DateTime? dateTimeValue2 = "1981-08-24".ConvertTo<DateTime?>();
五、谈谈NullableConverter上面谈到TypeConverter这个类型,并且说到它具有一系列针对具体数据类型的子类。其中一个子类就是NullableConverter,故名思义,这个TypeConverter专门用于Nullable<T>的类型转换。使用该类实现针对可空值类型的转换很方便,比如: 3: DateTime? dateTimevalue = (DateTime?)converter.ConvertFromString(literalValue);
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net – 如何在网格行中显示枚举描述或名称?
- ASP.NET Identity外部认证提供程序自定义图标
- asp.net-mvc-routing – ASP.NET Core 1.0中的属性路由
- 看看.NET Core几个Options的简单使用
- asp.net – 环境标记助手
- asp.net-web-api – Web API 2 OWIN承载令牌认证 – Access
- asp.net-mvc – 在ASP.NET MVC 3中自定义模型绑定错误消息
- asp.net – 为特定页面指定MaxHttpCollectionKeys?
- asp.net-mvc – 如何使用ASP.NET Core,2.0中的Razor Pages处
- Asp.net Web Api开发 性能:使用Jil提升Json序列化性能
- 2.为EF Code-First设置开发环境
- 如何阻止IIS 8停止空闲的ASP.NET应用程序?
- asp.net – 如何在Sitecore中以编程方式创建项目
- asp.net-mvc – ASP.NET WEB API将DateTime作为U
- asp.net-mvc-3 – 在ASP.NET MVC中使用@ data-bi
- 使用实体框架在ASP.Net中创建报表
- asp.net-mvc-3 – 为什么Html.Label()不适用于句
- BeginRequest触发ASP.NET MVC应用程序中的静态文
- ASP.NET jQuery UI模式:将aspx页面加载到模态对
- ASP.NET中的Application和Cache有什么区别?