2017-02-22 68 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