创建具有泛型的对象实例
本文关键字:对象 实例 泛型 创建 | 更新日期: 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#构造函数不支持类型推断