2013-05-15 69 views
0

我想調用一個通用函數,它實現了一組接口的屬性。通用函數實現接口

代碼如下:

public bool NeedsRenderAction<M, U>(M parent, U child) 
      where M : IVrsnProps 
      where U : IVrsnProps 
     { 
      return true; 
     } 

我打電話它下面的方式。從剃刀視角。

bool x = NeedsRenderAction<LayoutVrsn, WidgetVrsn>(Model.SPV, widget); 

該調用甚至不會觸及該函數。 它錯誤的了:有一個從「layoutvrsn對象」到「IVrsnProps」

任何變通PLZ沒有隱式引用轉換...............

+0

LayoutVrsn和WidgetVrsn是否實現了IVrsnProps? – graumanoz

回答

2

它看起來像您傳遞的參數Model.SPV未實現IVrsnProps接口,並且您在函數中定義的通用約束會阻止您執行它。從錯誤信息中可以看出,它看起來像SPV屬性是object,這顯然與IVrsnProps接口無關。

對於這個工作您應該刪除該泛型約束或你的正確類型的SPV性質:

public IVrsnProps SPV { get; set; } 

同代表當然是真的爲你的第二個參數。您正在傳遞一些widget變量,並且爲了實現此功能,此變量必須是實現IVrsnProps接口的類型。

+0

但我強迫它實施IVrsnProps – user1840841

+0

你是哪裏做的?在函數中?這是通用的約束。通用約束意味着你需要傳遞一個滿足這個約束的變量。這就是泛型工作原理。泛型確保編譯時安全,這意味着如果不能保證您傳遞正確的類型,您的代碼將無法編譯。在你的情況下,你正在傳遞'object',這在運行時可能是絕對的。根本沒有保證。我建議你閱讀更多關於泛型以及如何/何時應該使用它們。 –

+0

它消除它的約束,但我必須要約束。並設置SPV,我已經在做下面的東西,因爲SPV也是通用的。公共T SPV {get;組; }所以你想讓我重寫這個,或者我可以創建另一個實現IVrsnProps的屬性 – user1840841