Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/136.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_Type Inference - Fatal编程技术网

C# 访问嵌套泛型类型参数

C# 访问嵌套泛型类型参数,c#,generics,type-inference,C#,Generics,Type Inference,假设我有这样的代码: // This represents some query that will return type T when executed. public interface IQuery<T> { } // An example query that returns bool public class MyQuery : IQuery<bool> { } // A separate class that's actually responsible

假设我有这样的代码:

// This represents some query that will return type T when executed.
public interface IQuery<T> { }

// An example query that returns bool
public class MyQuery : IQuery<bool> { }

// A separate class that's actually responsible for executing the queries.
public class Executor {
    public T Execute<T>(IQuery<T> query)
}

// Usage
executor.Execute(new MyQuery()) // => true/false
//这表示执行时将返回类型T的某些查询。
公共接口IQuery{}
//返回bool的示例查询
公共类MyQuery:IQuery{}
//一个单独的类,实际负责执行查询。
公共类执行者{
公共T执行(IQuery查询)
}
//用法
executor.Execute(新建MyQuery())/=>true/false
到目前为止没有问题。但是假设我想更改executor类,使其负责查询的实例化。理想情况下,我希望用法类似于:

// Usage
executor.Execute<MyQuery>() // => true/false
//用法
executor.Execute()/>真/假
然而,我似乎找不到一种方法来建模这个方法签名。我能得到的最接近的结果是:

public T Execute<TQuery, T>() where TQuery : IQuery<T>
public T Execute(),其中TQuery:IQuery
此签名的问题在于,它需要显式指定所有类型参数。由于在推断类型参数时不考虑泛型类型约束,因此无法从
TQuery
推断
T

到目前为止,我发现的唯一解决方法是设置一个伪参数,以帮助从形式参数进行推理。基本上返回到原始示例,但不是使用
newmyquery()
传递实际实例,我可以传递类似
default(MyQuery)
的内容。这是笨重的,但是,使API一点也不明显


是否有我缺少的一些解决方法?

尝试以下操作:
where TQuery:IQuery,new()
,但请注意,您有两个泛型参数这一事实意味着您还需要指定两个泛型参数。可能重复