我正試圖通過以下方案。但是運行這個編譯時錯誤。從派生到基類沒有拳擊轉換
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();
}
}
謝謝!我注意到我在示例代碼中犯了一些錯誤,我將用工作變體替換它。 – user2994682