加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

谈谈Nullable<T>的类型转换问题

发布时间:2020-12-16 09:10:07 所属栏目:asp.Net 来源:网络整理
导读:本篇文章讨论可空值类型(NullableT)的转换,却确地说是如何将一种类型的值对象转换成相应的可空值。这来源于今天我们的一个成员遇到的一个小问题,我经过一些整理写了这篇文章。虽然没有什么技术含量可言,也希望对某些读者带来帮助。 目录 一、四种典型的

本篇文章讨论可空值类型(Nullable<T>)的转换,却确地说是如何将一种类型的值对象转换成相应的可空值。这来源于今天我们的一个成员遇到的一个小问题,我经过一些整理写了这篇文章。虽然没有什么技术含量可言,也希望对某些读者带来帮助。

目录
一、四种典型的值类型转换方式
二、当类型转换遭遇Nullable<T>
三、将基于Nullable<T>的类型转换实现在扩展方法中
四、进一步完善扩展方法ConvertTo
五、谈谈NullableTypeConverter

一、四种典型的类型转换方式

对于类型转化,或者进一步地,对于像Int、Double、DateTime、String等这些原生类型之间的转化,我们具有四种典型的转换方式。如果类型之间不具有隐士转换关系存储,我们可以之间通过类型转换操作符进行显式转换,比如:

   1: double doubleValue  = 3.14159265;
    
int intValue1       = Convert.ToInt32(literalValue);
string literalValue                 = "1981-08-24";
   3: DateTime dateTimeValue?? = (DateTime)dateTypeConverter.ConvertFromString(literalValue);
   5: literalValue                        = "02:40:50";
   7: TimeSpan timeSpanValue              = (TimeSpan)timeSpanConverter.ConvertFromString(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);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读