2014-02-12 21 views
0

我正試圖通過以下方案。但是運行這個編譯時錯誤。從派生到基類沒有拳擊轉換

The type 'DerivedDefinition' cannot be used as type parameter 'T' in the generic type or method 'BaseInstance<T>'. There is no boxing conversion or type parameter conversion from 'DerivedDefinition' to 'BaseDefinition'. 

原因是什麼?我該如何解決這個問題?

這與先前的問題https://stackoverflow.com/questions/21718509/supporting-generic-and-non-generic-implementation

UPDATE:這是基於以下

public abstract class BaseDefinition 
{ 
    public virtual void Print() { Console.WriteLine("base definition"); } 
} 
public class DerivedDefinition : BaseDefinition 
{ 
    public override void Print() { Console.WriteLine("derived definition"); } 
} 


public abstract class BaseInstance 
{ 
    protected BaseDefinition definition; 
    public BaseDefinition Definition { get { return definition; } } 
} 

public abstract class BaseInstance<T> : BaseInstance where T : BaseDefinition 
{ 
    //public T DefinitionExact { get { return (T)definition; } } 
} 

public class DerivedInstance : BaseInstance<DerivedDefinition> 
{ 
    public DerivedInstance() 
    { 
     definition = new DerivedDefinition(); 
    } 
} 


class TestClass 
{ 
    static void Main(string[] args) 
    { 
     BaseInstance baseInstance = new DerivedInstance(); 
     baseInstance.Definition.Print(); 
     //baseInstance.DefinitionExact.Print(); 

     DerivedInstance derivedInstance = new DerivedInstance(); 
     derivedInstance.Definition.Print(); 
    } 
} 

下面的代碼所提供的答案正確的工作代碼是非常非常錯誤的...

public abstract class BaseDefinition 
{ 
    public virtual string Print() { Console.WriteLine("base definition"); } 
} 
public class DerivedDefinition : BaseDefinition 
{ 
    public override string Print() { Console.WriteLine("derived definition"); } 
} 


public abstract class BaseInstance 
{ 
    private BaseDefinition definition; 
    protected BaseDefinition Definition { get { return definition; } } 
} 

public abstract class BaseInstance<T> : BaseInstance where T : BaseDefinition 
{ 
    protected T DefinitionExact { get { return (T)definition; } } 
} 

public class DerivedInstance<DerivedDefinition> : BaseInstance<DerivedDefinition> 
{ 
    public DerivedInstance() 
    { 
     definition = new DerivedDefinition(); 
    } 
} 


class TestClass 
{ 
    static void Main(string[] args) 
    { 
     BaseInstance baseInstance = new DerivedInstance<DerivedDefinition>(); 
     baseInstance.Definition.Print(); 
     baseInstance.DefinitionExact.Print(); 

    } 
} 

回答

1

要解決的編譯器錯誤,需要約束的類型參數在派生類,所以它滿足基類的約束:

public class DerivedInstance<DerivedDefinition> : BaseInstance<DerivedDefinition> 
    where DerivedDefinition : BaseDefinition 
{ 
    public DerivedInstance() 
    { 
     definition = new DerivedDefinition(); 
    } 
} 

然而,由於你的類型參數的名稱是相同的類的名字之一,我懷疑你其實是要做到這一點:

public class DerivedInstance : BaseInstance<DerivedDefinition> 
{ 
    public DerivedInstance() 
    { 
     definition = new DerivedDefinition(); 
    } 
} 

也就是說,DerivedInst ance類可能並不是通用的,而是您打算提供DerivedDefinition作爲基類的類型參數的參數。

+0

謝謝!我注意到我在示例代碼中犯了一些錯誤,我將用工作變體替換它。 – user2994682

1

您對如何設置仿製藥有疑問:

public class DerivedInstance<DerivedDefinition> : BaseInstance<DerivedDefinition> 
{ 
    public DerivedInstance() 
    { 
     definition = new DerivedDefinition(); 
    } 
} 

當你聲明一個泛型類時,你把名字放在<>這將是你的類內部處理的類型。您是否希望讓你的代碼看起來像下面的更換:

public class DerivedInstance<T> : BaseInstance<T> 
{ 
    public DerivedInstance() 
    { 
     definition = new DerivedDefinition(); 
    } 
}