原来如此,可空类型的赋值直接等效于构造实例。赋null时其实就是调用空构造函数,有值时就就把值传入带参数的构造函数。(柳暗花明又一村。如此,我们是否可以接着上面截图中的??继续模拟可空类型呢?且继续往下看。)
<span style="color: #0000ff;">namespace<span style="color: #000000;"> 可空类型
{
<span style="color: #0000ff;">public <span style="color: #0000ff;">class<span style="color: #000000;"> Person
{
<span style="color: #808080;">/// <span style="color: #808080;">
<span style="color: #808080;">///<span style="color: #008000;"> 出生日期
<span style="color: #808080;">/// <span style="color: #808080;">
<span style="color: #0000ff;">public DateTime BeginTime { <span style="color: #0000ff;">get; <span style="color: #0000ff;">set<span style="color: #000000;">; }
<span style="color: #808080;">/// <span style="color: #808080;">
<span style="color: #808080;">///<span style="color: #008000;"> 死亡日期
<span style="color: #808080;">/// <span style="color: #808080;">
<span style="color: #0000ff;">public MyNullable
EndTiem { <span style="color: #0000ff;">get; <span style="color: #0000ff;">set; } <span style="color: #008000;">//<span style="color: #008000;">这里改用MyNullable
<span style="color: #808080;">/// <span style="color: #808080;">
<span style="color: #808080;">///<span style="color: #008000;"> 年龄
<span style="color: #808080;">/// <span style="color: #808080;">
<span style="color: #0000ff;">public <span style="color: #0000ff;">double<span style="color: #000000;"> Age
{
<span style="color: #0000ff;">get<span style="color: #000000;">
{
<span style="color: #0000ff;">if (EndTiem.HasValue)<span style="color: #008000;">//<span style="color: #008000;">如果挂了(如果有值,证明死了)
<span style="color: #000000;"> {
<span style="color: #0000ff;">return (EndTiem.Value - BeginTime).Days / <span style="color: #800080;">365<span style="color: #000000;">;
}
<span style="color: #0000ff;">else<span style="color: #008000;">//<span style="color: #008000;">还没挂
<span style="color: #000000;"> {
<span style="color: #0000ff;">return (DateTime.Now - BeginTime).Days / <span style="color: #800080;">365<span style="color: #000000;">;
}
}
}
}
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">struct</span> MyNullable<T> <span style="color: #0000ff;">where</span> T : <span style="color: #0000ff;">struct</span><span style="color: #000000;">
{
</span><span style="color: #008000;">//</span><span style="color: #008000;">错误 1 结构不能包含显式的无参数构造函数
</span><span style="color: #008000;">//</span><span style="color: #008000;">还好 bool默认值就是false,所以这里不显示为 this._hasValue = false也不会有影响
</span><span style="color: #008000;">//</span><span style="color: #008000;">public MyNullable()
</span><span style="color: #008000;">//</span><span style="color: #008000;">{
</span><span style="color: #008000;">//</span><span style="color: #008000;"> this._hasValue = false;
</span><span style="color: #008000;">//</span><span style="color: #008000;">}</span>
<span style="color: #0000ff;">public</span> MyNullable(T value)<span style="color: #008000;">//</span><span style="color: #008000;">有参构造函数</span>
<span style="color: #000000;"> {
<span style="color: #0000ff;">this._hasValue = <span style="color: #0000ff;">true<span style="color: #000000;">;
<span style="color: #0000ff;">this._value =<span style="color: #000000;"> value;
}
</span><span style="color: #0000ff;">private</span> <span style="color: #0000ff;">bool</span><span style="color: #000000;"> _hasValue;
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">bool</span> HasValue<span style="color: #008000;">//</span><span style="color: #008000;">是否不为空</span>
<span style="color: #000000;"> {
<span style="color: #0000ff;">get { <span style="color: #0000ff;">return<span style="color: #000000;"> _hasValue; }
}
</span><span style="color: #0000ff;">private</span><span style="color: #000000;"> T _value;
</span><span style="color: #0000ff;">public</span> T Value<span style="color: #008000;">//</span><span style="color: #008000;">值</span>
<span style="color: #000000;"> {
<span style="color: #0000ff;">get<span style="color: #000000;">
{
<span style="color: #0000ff;">if (!<span style="color: #0000ff;">this._hasValue)<span style="color: #008000;">//<span style="color: #008000;">如没有值,还访问就抛出异常
<span style="color: #000000;"> {
<span style="color: #0000ff;">throw <span style="color: #0000ff;">new Exception(<span style="color: #800000;">"<span style="color: #800000;"> 可为空的对象必须具有一个值<span style="color: #800000;">"<span style="color: #000000;">);
}
<span style="color: #0000ff;">return<span style="color: #000000;"> _value;
}
}
}
<span style="color: #0000ff;">class<span style="color: #000000;"> Program
{
<span style="color: #0000ff;">static <span style="color: #0000ff;">void Main(<span style="color: #0000ff;">string<span style="color: #000000;">[] args)
{
Person p1 = <span style="color: #0000ff;">new<span style="color: #000000;"> Person()
{
BeginTime = DateTime.Parse(<span style="color: #800000;">"<span style="color: #800000;">1990-07-19<span style="color: #800000;">"<span style="color: #000000;">)
};
Person p2 </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;"> Person()
{
BeginTime </span>= DateTime.Parse(<span style="color: #800000;">"</span><span style="color: #800000;">1893-12-26</span><span style="color: #800000;">"</span><span style="color: #000000;">),EndTiem </span>= <span style="color: #0000ff;">new</span> MyNullable<DateTime>(DateTime.Parse(<span style="color: #800000;">"</span><span style="color: #800000;">1976-09-09</span><span style="color: #800000;">"</span>))<span style="color: #008000;">//</span><span style="color: #008000;">这里使用MyNullable的有参构造函数</span>
<span style="color: #000000;"> };
Console.WriteLine(</span><span style="color: #800000;">"</span><span style="color: #800000;">我今年</span><span style="color: #800000;">"</span> + p1.Age + <span style="color: #800000;">"</span><span style="color: #800000;">岁。</span><span style="color: #800000;">"</span><span style="color: #000000;">);
Console.WriteLine(</span><span style="color: #800000;">"</span><span style="color: #800000;">毛爷爷活了</span><span style="color: #800000;">"</span> + p2.Age + <span style="color: #800000;">"</span><span style="color: #800000;">岁。</span><span style="color: #800000;">"</span><span style="color: #000000;">);
Console.ReadKey();
}
}
}
和系统的可空类型得出了相同的结果。
总结
- 可空类型是结构(也就是值类型)
- 所以可空类型的null值和引用类型的null是不一样的。()
有同学问,怎么样才可以做到直接赋值呢?这个我也没有什么好的办法,或许需要编译器的支持。
以上内容都是胡说八道。希望能对您有那么一点点用处,感谢阅读。
(首发链接:?)
============== 2016-06-05更新==============
上面我们提出了疑问“怎么样才可以做到直接赋值呢”,本来我是没有好的解决办法。这里要感谢我们的园友@给我提供了好的解决方案。
implicit()
MyNullable MyNullable
只需要在? MyNullable?中添加以上代码,就可以直接赋值了。()
完整代码如下:
<span style="color: #0000ff;">namespace<span style="color: #000000;"> test
{
<span style="color: #0000ff;">public <span style="color: #0000ff;">class<span style="color: #000000;"> Person
{
<span style="color: #808080;">/// <span style="color: #808080;">
<span style="color: #808080;">///<span style="color: #008000;"> 出生日期
<span style="color: #808080;">/// <span style="color: #808080;">
<span style="color: #0000ff;">public DateTime BeginTime { <span style="color: #0000ff;">get; <span style="color: #0000ff;">set<span style="color: #000000;">; }
<span style="color: #808080;">/// <span style="color: #808080;">
<span style="color: #808080;">///<span style="color: #008000;"> 死亡日期
<span style="color: #808080;">/// <span style="color: #808080;">
<span style="color: #0000ff;">public MyNullable
EndTiem { <span style="color: #0000ff;">get; <span style="color: #0000ff;">set; } <span style="color: #008000;">//<span style="color: #008000;">这里改用MyNullable
<span style="color: #808080;">/// <span style="color: #808080;">
<span style="color: #808080;">///<span style="color: #008000;"> 年龄
<span style="color: #808080;">/// <span style="color: #808080;">
<span style="color: #0000ff;">public <span style="color: #0000ff;">double<span style="color: #000000;"> Age
{
<span style="color: #0000ff;">get<span style="color: #000000;">
{
<span style="color: #0000ff;">if (EndTiem.HasValue)<span style="color: #008000;">//<span style="color: #008000;">如果挂了(如果有值,证明死了)
<span style="color: #000000;"> {
<span style="color: #0000ff;">return (EndTiem.Value - BeginTime).Days / <span style="color: #800080;">365<span style="color: #000000;">;
}
<span style="color: #0000ff;">else<span style="color: #008000;">//<span style="color: #008000;">还没挂
<span style="color: #000000;"> {
<span style="color: #0000ff;">return (DateTime.Now - BeginTime).Days / <span style="color: #800080;">365<span style="color: #000000;">;
}
}
}
}
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">struct</span> MyNullable<T> <span style="color: #0000ff;">where</span> T : <span style="color: #0000ff;">struct</span><span style="color: #000000;">
{
</span><span style="color: #008000;">//</span><span style="color: #008000;">错误 1 结构不能包含显式的无参数构造函数
</span><span style="color: #008000;">//</span><span style="color: #008000;">还好 bool默认值就是false,所以这里不显示为 this._hasValue = false也不会有影响
</span><span style="color: #008000;">//</span><span style="color: #008000;">public MyNullable()
</span><span style="color: #008000;">//</span><span style="color: #008000;">{
</span><span style="color: #008000;">//</span><span style="color: #008000;"> this._hasValue = false;
</span><span style="color: #008000;">//</span><span style="color: #008000;">} </span>
<span style="color: #0000ff;">public</span> MyNullable(T value)<span style="color: #008000;">//</span><span style="color: #008000;">有参构造函数</span>
<span style="color: #000000;"> {
<span style="color: #0000ff;">this._hasValue = <span style="color: #0000ff;">true<span style="color: #000000;">;
<span style="color: #0000ff;">this._value =<span style="color: #000000;"> value;
}
</span><span style="color: #0000ff;">private</span> <span style="color: #0000ff;">bool</span><span style="color: #000000;"> _hasValue;
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">bool</span> HasValue<span style="color: #008000;">//</span><span style="color: #008000;">是否不为空</span>
<span style="color: #000000;"> {
<span style="color: #0000ff;">get { <span style="color: #0000ff;">return<span style="color: #000000;"> _hasValue; }
}
</span><span style="color: #0000ff;">private</span><span style="color: #000000;"> T _value;
</span><span style="color: #0000ff;">public</span> T Value<span style="color: #008000;">//</span><span style="color: #008000;">值</span>
<span style="color: #000000;"> {
<span style="color: #0000ff;">get<span style="color: #000000;">
{
<span style="color: #0000ff;">if (!<span style="color: #0000ff;">this._hasValue)<span style="color: #008000;">//<span style="color: #008000;">如没有值,还访问就抛出异常
<span style="color: #000000;"> {
<span style="color: #0000ff;">throw <span style="color: #0000ff;">new InvalidOperationException(<span style="color: #800000;">"<span style="color: #800000;"> 可为空的对象必须具有一个值<span style="color: #800000;">"<span style="color: #000000;">);
}
<span style="color: #0000ff;">return<span style="color: #000000;"> _value;
}
}
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">implicit</span> <span style="color: #0000ff;">operator</span> MyNullable<T><span style="color: #000000;">(T value)
{
</span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">new</span> MyNullable<T><span style="color: #000000;">(value);
}
}
</span><span style="color: #0000ff;">class</span><span style="color: #000000;"> Program
{
</span><span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span> Main(<span style="color: #0000ff;">string</span><span style="color: #000000;">[] args)
{
Person p1 </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;"> Person()
{
BeginTime </span>= DateTime.Parse(<span style="color: #800000;">"</span><span style="color: #800000;">1990-07-19</span><span style="color: #800000;">"</span><span style="color: #000000;">)
};
Person p2 </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;"> Person()
{
BeginTime </span>= DateTime.Parse(<span style="color: #800000;">"</span><span style="color: #800000;">1893-12-26</span><span style="color: #800000;">"</span><span style="color: #000000;">),EndTiem </span>= DateTime.Parse(<span style="color: #800000;">"</span><span style="color: #800000;">1976-09-09</span><span style="color: #800000;">"</span><span style="color: #000000;">)
</span><span style="color: #008000;">//</span><span style="color: #008000;">new MyNullable<DateTime>(DateTime.Parse("1976-09-09"))
</span><span style="color: #008000;">//</span><span style="color: #008000;">这里使用MyNullable的有参构造函数</span>
<span style="color: #000000;"> };
Console.WriteLine(</span><span style="color: #800000;">"</span><span style="color: #800000;">我今年</span><span style="color: #800000;">"</span> + p1.Age + <span style="color: #800000;">"</span><span style="color: #800000;">岁。</span><span style="color: #800000;">"</span><span style="color: #000000;">);
Console.WriteLine(</span><span style="color: #800000;">"</span><span style="color: #800000;">毛爷爷活了</span><span style="color: #800000;">"</span> + p2.Age + <span style="color: #800000;">"</span><span style="color: #800000;">岁。</span><span style="color: #800000;">"</span><span style="color: #000000;">);
Console.ReadKey();
}
}
}
如此,我们已经完成了自定义可空类型的直接赋值。但只是部分,如果想要赋值null呢?
同样还是出现了最开始的编译错误。我们想到既然上面的值赋值可以重新(),那null应该也可以啊()。
再加一个重载:
MyNullable( (value == MyNullable Exception(
}
如此可以满足我们的需求了()。
可惜美中不足,如果给??赋值一个非空字符串时,要运行时才会报错()。不知道大神们可有解!!
虽然如此,能做到直接赋值还是让我小小激动了一把。为此,特意查了下关键字? ?,又是让我小小激动了一把,我们不仅可以“重写”赋值,我们还可以“重写”+ - * / % & | ^ << >> == != > < >= <=等运算符。
下面我们先来“重写”下自定义可空类型的比较()运算符。
==(MyNullable operand,MyNullable (!operand.HasValue && ! (operand.HasValue && <span style="color: #008000;">//<span style="color: #008000;">"重写"比较运算符
<span style="color: #0000ff;">public <span style="color: #0000ff;">static <span style="color: #0000ff;">bool <span style="color: #0000ff;">operator !=(MyNullable operand,MyNullable<span style="color: #000000;"> operand2)
{
<span style="color: #0000ff;">return !(operand ==<span style="color: #000000;"> operand2);
}
<div class="cnblogs_code">
Console.WriteLine( + (p1.EndTiem == + (p2.EndTiem == + (p1.EndTiem == DateTime.Parse( + (p2.EndTiem == DateTime.Parse(p1.EndTiem = DateTime.Parse(<span style="color: #800000;">"<span style="color: #800000;">2016-06-06<span style="color: #800000;">"<span style="color: #000000;">);
p2.EndTiem = <span style="color: #0000ff;">null<span style="color: #000000;">;
Console.WriteLine();
Console.WriteLine(<span style="color: #800000;">"<span style="color: #800000;">赋值 p1.EndTiem = DateTime.Parse(2016-06-06) p2.EndTiem = null 后:<span style="color: #800000;">"<span style="color: #000000;">);
Console.WriteLine(<span style="color: #800000;">"<span style="color: #800000;">p1.EndTiem == null,<span style="color: #800000;">" + (p2.EndTiem == <span style="color: #0000ff;">null<span style="color: #000000;">).ToString());
Console.WriteLine(<span style="color: #800000;">"<span style="color: #800000;">p1.EndTiem == DateTime.Parse(2016-06-06),<span style="color: #800000;">" + (p1.EndTiem == DateTime.Parse(<span style="color: #800000;">"<span style="color: #800000;">2016-06-06<span style="color: #800000;">"<span style="color: #000000;">)).ToString());
Console.WriteLine(<span style="color: #800000;">"<span style="color: #800000;">p2.EndTiem == DateTime.Parse(2016-06-06),
<span style="color: #800000;">" + (p2.EndTiem == DateTime.Parse(<span style="color: #800000;">"<span style="color: #800000;">2016-06-06<span style="color: #800000;">")).ToString());
<span style="color: #0000ff;">namespace<span style="color: #000000;"> test
{
<span style="color: #0000ff;">public <span style="color: #0000ff;">class<span style="color: #000000;"> Person
{
<span style="color: #808080;">/// <span style="color: #808080;">
<span style="color: #808080;">///<span style="color: #008000;"> 出生日期
<span style="color: #808080;">/// <span style="color: #808080;">
<span style="color: #0000ff;">public DateTime BeginTime { <span style="color: #0000ff;">get; <span style="color: #0000ff;">set<span style="color: #000000;">; }
<span style="color: #808080;">/// <span style="color: #808080;">
<span style="color: #808080;">///<span style="color: #008000;"> 死亡日期
<span style="color: #808080;">/// <span style="color: #808080;">
<span style="color: #0000ff;">public MyNullable
EndTiem { <span style="color: #0000ff;">get; <span style="color: #0000ff;">set; } <span style="color: #008000;">//<span style="color: #008000;">这里改用MyNullable
<span style="color: #808080;">/// <span style="color: #808080;">
<span style="color: #808080;">///<span style="color: #008000;"> 年龄
<span style="color: #808080;">/// <span style="color: #808080;">
<span style="color: #0000ff;">public <span style="color: #0000ff;">double<span style="color: #000000;"> Age
{
<span style="color: #0000ff;">get<span style="color: #000000;">
{
<span style="color: #0000ff;">if (EndTiem.HasValue)<span style="color: #008000;">//<span style="color: #008000;">如果挂了(如果有值,证明死了)
<span style="color: #000000;"> {
<span style="color: #0000ff;">return (EndTiem.Value - BeginTime).Days / <span style="color: #800080;">365<span style="color: #000000;">;
}
<span style="color: #0000ff;">else<span style="color: #008000;">//<span style="color: #008000;">还没挂
<span style="color: #000000;"> {
<span style="color: #0000ff;">return (DateTime.Now - BeginTime).Days / <span style="color: #800080;">365<span style="color: #000000;">;
}
}
}
}
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">struct</span> MyNullable<T> <span style="color: #0000ff;">where</span> T : <span style="color: #0000ff;">struct</span><span style="color: #000000;">
{
</span><span style="color: #008000;">//</span><span style="color: #008000;">错误 1 结构不能包含显式的无参数构造函数
</span><span style="color: #008000;">//</span><span style="color: #008000;">还好 bool默认值就是false,所以这里不显示为 this._hasValue = false也不会有影响
</span><span style="color: #008000;">//</span><span style="color: #008000;">public MyNullable()
</span><span style="color: #008000;">//</span><span style="color: #008000;">{
</span><span style="color: #008000;">//</span><span style="color: #008000;"> this._hasValue = false;
</span><span style="color: #008000;">//</span><span style="color: #008000;">} </span>
<span style="color: #0000ff;">public</span> MyNullable(T value)<span style="color: #008000;">//</span><span style="color: #008000;">有参构造函数</span>
<span style="color: #000000;"> {
<span style="color: #0000ff;">this._hasValue = <span style="color: #0000ff;">true<span style="color: #000000;">;
<span style="color: #0000ff;">this._value =<span style="color: #000000;"> value;
}
</span><span style="color: #0000ff;">private</span> <span style="color: #0000ff;">bool</span><span style="color: #000000;"> _hasValue;
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">bool</span> HasValue<span style="color: #008000;">//</span><span style="color: #008000;">是否不为空</span>
<span style="color: #000000;"> {
<span style="color: #0000ff;">get { <span style="color: #0000ff;">return<span style="color: #000000;"> _hasValue; }
}
</span><span style="color: #0000ff;">private</span><span style="color: #000000;"> T _value;
</span><span style="color: #0000ff;">public</span> T Value<span style="color: #008000;">//</span><span style="color: #008000;">值</span>
<span style="color: #000000;"> {
<span style="color: #0000ff;">get<span style="color: #000000;">
{
<span style="color: #0000ff;">if (!<span style="color: #0000ff;">this._hasValue)<span style="color: #008000;">//<span style="color: #008000;">如没有值,还访问就抛出异常
<span style="color: #000000;"> {
<span style="color: #0000ff;">throw <span style="color: #0000ff;">new InvalidOperationException(<span style="color: #800000;">"<span style="color: #800000;"> 可为空的对象必须具有一个值<span style="color: #800000;">"<span style="color: #000000;">);
}
<span style="color: #0000ff;">return<span style="color: #000000;"> _value;
}
}
</span><span style="color: #008000;">//</span><span style="color: #008000;">隐式转换</span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">implicit</span> <span style="color: #0000ff;">operator</span> MyNullable<T><span style="color: #000000;">(T value)
{
</span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">new</span> MyNullable<T><span style="color: #000000;">(value);
}
</span><span style="color: #008000;">//</span><span style="color: #008000;">隐式转换</span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">implicit</span> <span style="color: #0000ff;">operator</span> MyNullable<T>(<span style="color: #0000ff;">string</span><span style="color: #000000;"> value)
{
</span><span style="color: #0000ff;">if</span> (value == <span style="color: #0000ff;">null</span><span style="color: #000000;">)
</span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">new</span> MyNullable<T><span style="color: #000000;">();
</span><span style="color: #0000ff;">throw</span> <span style="color: #0000ff;">new</span> Exception(<span style="color: #800000;">"</span><span style="color: #800000;">赋值右边不能为字符串</span><span style="color: #800000;">"</span><span style="color: #000000;">);
</span><span style="color: #008000;">//</span><span style="color: #008000;">这里不知道是否可以在编译期间抛出错误(或者怎样限制只能传null)</span>
<span style="color: #000000;"> }
</span><span style="color: #008000;">//</span><span style="color: #008000;">"重写"比较运算符</span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">bool</span> <span style="color: #0000ff;">operator</span> ==(MyNullable<T> operand,MyNullable<T><span style="color: #000000;"> operand2)
{
</span><span style="color: #0000ff;">if</span> (!operand.HasValue && !<span style="color: #000000;">operand2.HasValue)
{
</span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">true</span><span style="color: #000000;">;
}
</span><span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span> (operand.HasValue &&<span style="color: #000000;"> operand2.HasValue)
{
</span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (operand2.Value.Equals(operand.Value))
{
</span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">true</span><span style="color: #000000;">;
}
}
</span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #000000;">;
}
</span><span style="color: #008000;">//</span><span style="color: #008000;">"重写"比较运算符</span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">bool</span> <span style="color: #0000ff;">operator</span> !=(MyNullable<T> operand,MyNullable<T><span style="color: #000000;"> operand2)
{
</span><span style="color: #0000ff;">return</span> !(operand ==<span style="color: #000000;"> operand2);
}
}
</span><span style="color: #0000ff;">class</span><span style="color: #000000;"> Program
{
</span><span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span> Main(<span style="color: #0000ff;">string</span><span style="color: #000000;">[] args)
{
Person p1 </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;"> Person()
{
BeginTime </span>= DateTime.Parse(<span style="color: #800000;">"</span><span style="color: #800000;">1990-07-19</span><span style="color: #800000;">"</span><span style="color: #000000;">)
};
Person p2 </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;"> Person()
{
BeginTime </span>= DateTime.Parse(<span style="color: #800000;">"</span><span style="color: #800000;">1893-12-26</span><span style="color: #800000;">"</span><span style="color: #000000;">),EndTiem </span>= DateTime.Parse(<span style="color: #800000;">"</span><span style="color: #800000;">1976-09-09</span><span style="color: #800000;">"</span><span style="color: #000000;">)
</span><span style="color: #008000;">//</span><span style="color: #008000;">new MyNullable<DateTime>(DateTime.Parse("1976-09-09"))
</span><span style="color: #008000;">//</span><span style="color: #008000;">这里使用MyNullable的有参构造函数</span>
<span style="color: #000000;"> };
Console.WriteLine(</span><span style="color: #800000;">"</span><span style="color: #800000;">我今年</span><span style="color: #800000;">"</span> + p1.Age + <span style="color: #800000;">"</span><span style="color: #800000;">岁。</span><span style="color: #800000;">"</span><span style="color: #000000;">);
Console.WriteLine(</span><span style="color: #800000;">"</span><span style="color: #800000;">毛爷爷活了</span><span style="color: #800000;">"</span> + p2.Age + <span style="color: #800000;">"</span><span style="color: #800000;">岁。</span><span style="color: #800000;">"</span><span style="color: #000000;">);
Console.WriteLine();
Console.WriteLine(</span><span style="color: #800000;">"</span><span style="color: #800000;">p1.EndTiem == null,</span><span style="color: #800000;">"</span> + (p1.EndTiem == <span style="color: #0000ff;">null</span><span style="color: #000000;">).ToString());
Console.WriteLine(</span><span style="color: #800000;">"</span><span style="color: #800000;">p2.EndTiem == null,</span><span style="color: #800000;">"</span> + (p2.EndTiem == <span style="color: #0000ff;">null</span><span style="color: #000000;">).ToString());
Console.WriteLine(</span><span style="color: #800000;">"</span><span style="color: #800000;">p1.EndTiem == DateTime.Parse(1976-09-09),</span><span style="color: #800000;">"</span> + (p1.EndTiem == DateTime.Parse(<span style="color: #800000;">"</span><span style="color: #800000;">1976-09-09</span><span style="color: #800000;">"</span><span style="color: #000000;">)).ToString());
Console.WriteLine(</span><span style="color: #800000;">"</span><span style="color: #800000;">p2.EndTiem == DateTime.Parse(1976-09-09),</span><span style="color: #800000;">"</span> + (p2.EndTiem == DateTime.Parse(<span style="color: #800000;">"</span><span style="color: #800000;">1976-09-09</span><span style="color: #800000;">"</span><span style="color: #000000;">)).ToString());
p1.EndTiem </span>= DateTime.Parse(<span style="color: #800000;">"</span><span style="color: #800000;">2016-06-06</span><span style="color: #800000;">"</span><span style="color: #000000;">);
p2.EndTiem </span>= <span style="color: #0000ff;">null</span><span style="color: #000000;">;
Console.WriteLine();
Console.WriteLine(</span><span style="color: #800000;">"</span><span style="color: #800000;">赋值 p1.EndTiem = DateTime.Parse(2016-06-06) p2.EndTiem = null 后:</span><span style="color: #800000;">"</span><span style="color: #000000;">);
Console.WriteLine(</span><span style="color: #800000;">"</span><span style="color: #800000;">p1.EndTiem == null,</span><span style="color: #800000;">"</span> + (p2.EndTiem == <span style="color: #0000ff;">null</span><span style="color: #000000;">).ToString());
Console.WriteLine(</span><span style="color: #800000;">"</span><span style="color: #800000;">p1.EndTiem == DateTime.Parse(2016-06-06),</span><span style="color: #800000;">"</span> + (p1.EndTiem == DateTime.Parse(<span style="color: #800000;">"</span><span style="color: #800000;">2016-06-06</span><span style="color: #800000;">"</span><span style="color: #000000;">)).ToString());
Console.WriteLine(</span><span style="color: #800000;">"</span><span style="color: #800000;">p2.EndTiem == DateTime.Parse(2016-06-06),</span><span style="color: #800000;">"</span> + (p2.EndTiem == DateTime.Parse(<span style="color: #800000;">"</span><span style="color: #800000;">2016-06-06</span><span style="color: #800000;">"</span><span style="color: #000000;">)).ToString());
Console.ReadKey();
}
}
}
转换关键字:operator、explicit与implicit解析资料:
大家还可以玩出更多的花样!!!
本文已同步至《》
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!