c# - 无法将基实例的对象转换为派生类型(泛型用法)
问题描述
我有一个带有start和end的区间的通用版本,以及一个使用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)
{
}
}
解决方案
这个问题与方差和泛型无关。下一个代码会给你同样的错误:
class Interval1
{
public static Interval1 Empty = new Interval1();
}
class DateTimeInterval1 : Interval1
{
}
DateTimeInterval1 p = (DateTimeInterval1)DateTimeInterval1.Empty;
原因是notEmpty
的实例,因此不能强制转换为.Interval
DateTimeInterval
DateTimeInterval
推荐阅读
- sharepoint-2013 - 网站集之间搜索结果的隐私
- php - 将 startDatetime 和 endDatetime 与 DB 表的 startDatetime 和 endDatetime 进行比较
- python - 如何使用 Python 读取多个文件夹中的文件
- apache-camel - Camel:从另一个路由调用一个路由并同步返回响应
- c++ - 无限循环中的返回值
- java - POJO for rest获取调用以在java中返回嵌套的复杂json
- python-2.7 - 包装模块的每个类的每个函数
- flutter - 在这种特殊情况下,当我点击它时如何让 _card 打开一个新的路线/页面?
- java - 如何将字符串日期转换为 ISO 日期格式日期
- sql - 为什么“where”语句似乎过滤了 SAS proc SQL 中的预期行?