C# 无法将类型转换为完全相同类型的受约束泛型
我很好奇为什么这是一个编译错误:C# 无法将类型转换为完全相同类型的受约束泛型,c#,generics,C#,Generics,我很好奇为什么这是一个编译错误: public abstract class AbstractThingList<T> : List<T> { protected QueryBuilder<TH> Query<TH>(string query) where TH : AbstractThingList<T> { // Argument 1: cannot convert from 'AbstractThi
public abstract class AbstractThingList<T> : List<T>
{
protected QueryBuilder<TH> Query<TH>(string query) where TH : AbstractThingList<T>
{
// Argument 1: cannot convert from 'AbstractThingList<T>' to 'TH'
return new QueryBuilder<TH>(this, query);
}
protected class QueryBuilder<TH> where TH : AbstractThingList<T>
{
private readonly TH Container;
public QueryBuilder(TH container, string query)
{
Container = container;
}
public TH Execute()
{
return Container;
}
}
}
公共抽象类AbstractThingList:List
{
受保护的QueryBuilder查询(字符串查询),其中TH:AbstractThingList
{
//参数1:无法从“AbstractThingList”转换为“TH”
返回新的QueryBuilder(this,query);
}
受保护类QueryBuilder,其中TH:AbstractThingList
{
专用只读TH容器;
公共QueryBuilder(TH容器,字符串查询)
{
容器=容器;
}
公共行政
{
返回容器;
}
}
}
我收到错误消息参数1:无法从'AbstractThingList'转换为'TH'
,但是QueryBuilder将TH
约束为AbstractThingList
(与外部类中使用的T
完全相同),其中“this”无疑是的一个实例
我错过了什么吗?在
Query
方法中,TH
被限制为AbstractThingList
的子类型,而this
的类型是AbstractThingList
,它不一定是TH
的子类型。一个简单的反例是:
public class ThingList1 : AbstractThingList<string> { }
public class ThingList2 : AbstractThingList<string> {
private void SomeMethod() {
this.Query<ThingList1>("query")
}
}
公共类ThingList1:AbstractThingList{}
公共类ThingList 2:AbstractThingList{
私有方法(){
此查询(“查询”)
}
}
这是不允许的,因为
ThingList2
不是ThingList1
的子类型TH
是AbstractThingList
,但是这个
只保证是AbstractThingList
,不一定是TH
。啊,明白了。如果你想发布答案,我会接受。