我在代码中实例化匿名类型时遇到问题。
出于某种原因,TResponse response = default(TResponse);
会返回null
,即使TResponse
有一个构造函数。
我是愚蠢的吗?!
类别:
public class MyClass
{
public MyResponse GetResponse(MyRequest request)
{
return Service<MyRequest, MyResponse>.MakeRequest(
request,
delegate() {
return AnotherService.GetRequest(request);
}
);
}
}
服务类
public static class Service<TRequest, TResponse>
where TRequest : IRequest
where TResponse : IResponse
{
public delegate TResponse UseDelegate();
public TResponse MakeRequest(TRequest request, UseDelegate codeBlock)
{
TResponse response = default(TResponse); // <-- Returns nulll
response = codeBlock();
return response;
}
}
答案 0 :(得分:5)
正如Brandon所说,default
会为任何参考类型返回null
。
但是,我不明白你为什么要使用它 - 你分配的值将被codeBlock()
的返回值覆盖。换句话说,您可以将MakeRequest方法更改为:
public TResponse MakeRequest(TRequest request, UseDelegate codeBlock)
{
TResponse response = codeBlock();
return response;
}
甚至:
public TResponse MakeRequest(TRequest request, UseDelegate codeBlock)
{
return codeBlock();
}
我假设实际上还有更多的代码......但是如果你真的想要调用无参数构造函数,你可以用以下方法约束TResponse:
where TResponse : IResponse, new()
然后使用:
TResponse response = new TResponse();
通过这种方式,您将获得TResponse
具有无参数构造函数的编译时保证;只使用Activator.CreateInstance(typeof(TResponse))
TResponse
没有约束就行了,但会延迟找出你试图使用没有无参数构造函数的响应类型的问题。
此外,我没有在您的代码中看到任何匿名类型 - 如果您使用了匿名类型将具有无参数构造函数的唯一方法:
new {}
这有点无意义。
答案 1 :(得分:4)
默认(T)不像人们想象的那样调用类型T的默认构造函数。 default(T)表示类为null,0表示基元,值为所有字段初始化为null或0表示结构。
查看关键字default
答案 2 :(得分:1)
对于复杂类型,请使用Activator.CreateInstance
所以在你的例子中:TResponse response = Activator.CreateInstance<TResponse>();
答案 3 :(得分:1)
你应该使用new()约束,你的代码看起来像这样
public static class Service<TRequest, TResponse>
where TRequest : IRequest
where TResponse : IResponse, new()
{
public delegate TResponse UseDelegate();
public TResponse MakeRequest(TRequest request, UseDelegate codeBlock)
{
TResponse response = new TResponse();
response = codeBlock();
return response;
}
}
答案 4 :(得分:1)
如果您希望能够创建类型参数的新实例,则应使用new()通用constrait MSDN。