实例化匿名类型将返回null

时间:2010-02-15 10:13:56

标签: c# anonymous-types

我在代码中实例化匿名类型时遇到问题。

出于某种原因,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;
  }
}

5 个答案:

答案 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