首页 > 解决方案 > 无法将基实例的对象转换为派生类型(泛型用法)

问题描述

我有一个带有startend的区间的通用版本,以及一个使用DateTime.

为方便起见,通用版本定义了一个Empty值。当我运行此代码时,问题就来了。

它在 Main 方法的唯一一行抱怨:

无法将“Interval`1[System.DateTime]”类型的对象转换为“DateTimeInterval”类型。

它抱怨无法将实例转换为我想要的类型。为什么??我无法理解这个限制。

void Main()
{
    DateTimeInterval p = (DateTimeInterval)DateTimeInterval.Empty;
}

class Interval<T>
{
    public Interval(T start, T end)
    {       
        Start = start;
        End = end;
    }
    
    public T Start { get; set; }
    public T End { get; set; }
    
    public static Interval<T> Empty = new Interval<T>(default, default);
}

class DateTimeInterval : Interval<DateTime> 
{
    public DateTimeInterval(DateTime start, DateTime end):base(start, end)
    {       
    }   
}

标签: c#genericscovariancedowncast

解决方案


这个问题与方差和泛型无关。下一个代码会给你同样的错误:

class Interval1
{
    public static Interval1 Empty = new Interval1();
}

class DateTimeInterval1 : Interval1
{
}

DateTimeInterval1 p = (DateTimeInterval1)DateTimeInterval1.Empty;

原因是notEmpty的实例,因此不能强制转换为.IntervalDateTimeIntervalDateTimeInterval


推荐阅读