Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法将类型转换为完全相同类型的受约束泛型_C#_Generics - Fatal编程技术网

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
。啊,明白了。如果你想发布答案,我会接受。