同样的层次结构,只是泛型多了一个参数,实例化的时候就报“加载格式不正确”的错误
加载格式不正确:
AbstractSerializable<PO> c = new AbstractSerializable<PO>();
AbstractSerializable<PO, PO> b = new AbstractSerializable<PO, PO>();
第二句就会执行错误,第一句运行的很好,感觉就只是多了一个参数而以,不知道哪位能帮忙解释一下这奇怪的原因.TIA!/*
   以下是测试代码
   如果层次设计有问题也谢谢指出
*/public class ActiveRecord<T> where T : class { 
    // ...
}// T 继承于 AbstractPO<T>
public class AbstractData<T>
    where T : AbstractPO<T>, new() {
    // ...
}// 继承ActiveRecord<T>
// T 继承于 AbstractPO<T>
public class AbstractPO<T> : ActiveRecord<T> 
    where T : AbstractPO<T>, new(){
    // ...
}// 继承AbstractPO<T>
public class PO : AbstractPO<PO> { 
    // ..
}// 继承AbstractData<T>
// T 继承于 AbstractPO<T>
public class AbstractSerializable<T> : AbstractData<T>
    where T : AbstractPO<T>, new() {
    // ...
}// 继承AbstractData<T>
// S,T 都继承于 AbstractPO<T>
public class AbstractSerializable<S, T> : AbstractData<T>
    where S : AbstractPO<S>, new()
    where T : AbstractPO<T>, new() {
    // ...
}
// 执行
protected void Page_Load(object sender, EventArgs e)
{
    try {
        // 执行成功
        AbstractSerializable<PO> c = new AbstractSerializable<PO>();
        // 失败
        AbstractSerializable<PO, PO> b = new AbstractSerializable<PO, PO>();
    } catch (Exception ex) {
        Response.Write(ex.ToString());
    }
}页面错误的输出是
System.BadImageFormatException: 试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B) 在 AbstractSerializable`2..ctor() 在 __Default.Page_Load(Object sender, EventArgs e) 位置

解决方案 »

  1.   

    public   class   ActiveRecord <T>   //where   T   :   class 把这个去掉
    {   
            //   ... 

      

  2.   

    to:whycom 这个一般不能删的,因为这是另外的工程,如果为我这件事情修改的话,也许其它地方都要做相应的调整
    最理想的是修改我自己的代码
      

  3.   

    现在问题是解决了,将AbstractSerializable<S, T>的T约束修改成以下形式就不报错了
    但是为什么“where T : AbstractPO<T> , new()”和“where T : S”有很大区别吗?
    能人,可否解释一下?public   class   AbstractSerializable <S,   T>   :   AbstractData <T> 
            where   S   :   AbstractPO <S> ,   new() 
            where   T   :   S { 
            //   ... 
      

  4.   

    我太天真了 T : S 实现的是 T : AbstractPO <S> 而不是 T : AbstractPO <T>
    那么AbstractPO <S>  和 AbstractPO <T> 不能并存吗?
    问题还没解决。
      

  5.   

    to:nanjg 我将约束 T : AbstractPO <T> ,new(){ 修改成 T : class 然后下级的也改成这样
    就可已运行了PS: 上面的错误都是指运行时错误
      

  6.   

     public class ActiveRecord<T> //where T : class
        {
            
        }
    这样改就好用。具体为什么思考中