2017-02-22 77 views
0

这里是我下面的代码通用类,与不重要的部分节录:C#返回从方法

public class Response<T> 
{ 
    //... 
} 

public class Summary 
{ 
    //... 
} 

public class Db : IDb 
{ 
    public Response<Summary> Generate() 
    { 
     //... 
     return new Response<Summary> 
     { 
      //... 
     }; 
    } 

    public Response<Summary> Execute<Summary>() 
    { 
     return Generate(); 
    } 
} 

我得到一个错误,指出: Cannot implicitly convert type Response<Service.Models.Summary> to Response<Summary>.

我使用泛型错了吗?基本上,当我调用Generate()方法时,我希望看到一个Response模型,在这个例子中,T是Summary类。


我实现的接口是这样的:

public interface IDb 
{ 
    Response<T> Execute<T>(); 
} 
+1

为什么不发布您的代码,使人们可以帮你吗? http://stackoverflow.com/help/how-to-ask –

+0

添加了代码片段,谢谢 –

+1

我不明白为什么这会得到接近的选票。这似乎是一个完全合理的问题。 – Enigmativity

回答

3

你的方法public Response<Summary> Execute<Summary>()Summary是压倒一切的Summary类定义泛型参数。在Execute<Summary>()中的Response<Summary>的返回类型与Generate()中的返回类型不同。

这很可能是你的代码应该是:

public Response<Summary> Generate() 
{ 
    //... 
    return new Response<Summary> 
    { 
     //... 
    }; 
} 

public Response<Summary> Execute() 
{ 
    return Generate(); 
} 

鉴于除了你的界面IDb的那么上面的答案无效。

您必须实现Executepublic Response<T> Execute<T>(),这意味着,返回类型Response<T>编译时一样Response<Summary>。所以错误是正确的。

你现在基本上有一个设计缺陷。

这可能是因为您需要进行此更改:

public class Db : IDb<Summary> 
{ 
    public Response<Summary> Generate() 
    { 
     //... 
     return new Response<Summary> 
     { 
      //... 
     }; 
    } 

    public Response<Summary> Execute() 
    { 
     return Generate(); 
    } 
} 

public interface IDb<T> 
{ 
    Response<T> Execute(); 
} 
+0

一个很好的理由说明为什么遵循通用惯例给T类添加通用类型的前提:) – DavidG

+0

事情是当我改变响应执行()'到'Response Execute()'在IDb接口中,它说“命名空间T无法找到”。 –

+1

@Danny - 你添加了接口定义,它解释了为什么你有'公开响应

执行()' - 你应该实现它作为'公开响应执行()',那会让问题更加明显。我已经用一个建议更新了我的答案。正如附注一样,请不要以使现有答案无效的方式编辑您的问题。添加答案后始终添加新信息。 – Enigmativity