举个例子吧,我是在使用DataSet和DataTable时发现的问题,所以就以此举例,其他类型没试过,不过应该是一样的
public
class
myData : DataSet
... {
public myData()
...{
this.Tables.Add( new myDataTable() );
}
}
public class myDataTable : DataTable
... {
public myDataTable
...{
this.TableName = "MyDataTable";
this.Columns.Add( Column1, typeof(String) );
}
}
... {
public myData()
...{
this.Tables.Add( new myDataTable() );
}
}
public class myDataTable : DataTable
... {
public myDataTable
...{
this.TableName = "MyDataTable";
this.Columns.Add( Column1, typeof(String) );
}
}
就以上的这种结构,
声明一个myData类的实例myData111,然后使用myData111.Tables["MyDataTable"]从中取出其成员(取出来时应该是DataTable类型的实例),转换为myDataTable类型
即,
myDataTable myDataTable111
=
(myDataTable) myData111.Tables[
"
myDataTable
"
];
以上这样做,是一个最简单的符合面向对象法则的类型转换,但是如果将当初声明的myData111放入ViewState中,即
ViewState[
"
mydata
"
]
=
myData111;
当页面回发服务器时,从视图状态中取出对象,进行正常的类型转换,如下
myData myData111
=
(myData) ViewState[
"
mydata
"
];
myDataTable myTable111 = (myDataTable) myData111.Tables[ " myDataTable " ];
myDataTable myTable111 = (myDataTable) myData111.Tables[ " myDataTable " ];
以上两句,第一个转换无疑会成功,但是第二个转换则会失败(根据面向对象的原理也应该成功),这时可以查看myData111.Tables["myDataTable"].Type()已经是DataTable型了,而本应该是myDataTable型。
这种情况在Session和其他内存结构中都没有,只是ViewState中存在,估计是因为ViewState是放在页面中的,直接影响页面的大小,所以对于复杂的对象结构没能完全保留其原貌,也许是一个bug,也许是因为各种原因而无奈的有意为之
以上是在.net1.1环境中,使用VS.net 2003开发环境,Windows server 2003 sp1,IIS6.0等运行环境进行测试的。