创建具有泛型的对象实例

本文关键字:对象 实例 泛型 创建 | 更新日期: 2023-09-27 18:12:18

我有以下内容:

public class Query : IAsyncRequest<Envelope<Reply>> { }
public class Reply { }
public class Flow<TQuery, TReply> where TQuery: IAsyncRequest<Envelope<TReply>>, IRequest<Envelope<TReply>> {
  public TQuery Query { get; set; }
  public TReply Reply { get; set; }
  public Flow(TQuery query, TReply reply) {
    Query = query;
    Reply = reply;
  }
}

当我尝试创建Flow的实例

Query query = service.GetQuery();
Reply reply = service.GetReply();
Flow flow = new Flow(query, reply);

我得到错误:

Using the generic type 'Flow<TQuery, TReply>' requires 2 type arguments 

我不能这样创建一个流吗?

创建具有泛型的对象实例

不,你不能,正如@NineBerry的回答所说,语法new type必须是带有强制泛型参数的"real"类型,所以你必须写:

Flow<Query, Reply> flow = new Flow<Query, Reply> (query, reply);

也就是说,该约束不适用于方法,因此您可以编写一个静态方法来完成这项工作:

static class Flow // not generic (same name isn't mandatory)
{
    public static Flow<TQuery, TReply> Create (TQuery query, TReply, reply) where /* constraint */
    {
        return new Flow<TQuery, TReply> (query, reply);
    }
}
// usage
Flow<Query, Reply> flow = Flow.Create (query, reply);
// or with var
var flow = Flow.Create (query, reply);

您需要显式指定类型。这里不支持类型推断。参见为什么c#构造函数不能推断类型?

Query query = service.GetQuery();
Reply reply = service.GetReply();
var flow = new Flow<Query, Reply>(query, reply);

不,你必须定义你想使用的类型:

Flow<Query, Reply> flow = new Flow<Query, Reply>(query, reply);

c#构造函数不支持类型推断