2015-02-12 85 views
1

我想創建一個接受Type作爲參數的類,同時我想創建一個也是泛型類型的委託。示例代碼如下。我認爲它應該工作,OnGo委託從類聲明接收類型爲TypeAsParam。但是,評論線是錯誤的。有人知道如何解決這個問題嗎?謝謝大家:)C#要在類中使用generice類型委託也具有泛型類型

public delegate void OnGo<TypeInDel>(TypeInDel obj); 

public class MyClass<TypeAsParam> 
{ 
    public OnGo<TypeAsParam> MyDelegate; 
    public void Msg<TypeAsParam>() 
    { 
     TypeAsParam msg; 
     MyDelegate(msg); //here is wrong in VS editor, says cannot cast msg to TypeAsParam(not TypeInDel) 
    } 
} 
+0

我的水晶球說,你的意思是寫'公共無效消息(){/ * * /}' – 2015-02-12 09:35:00

回答

5

問題是與您的消息方法。在其中定義新的TypeParameter,因此編譯器無法確定來自類的TypeAsParam和來自方法的TypeAsParam是相同的。您需要從消息中刪除<TypeAsParam>或進行一些約束。

此外,你需要初始化你的味精這樣的:

var msg = default(TypeAsParam) 
+0

權,然而,通過使用默認的關鍵字,我們假設通過類型將有默認的構造函數。所以最好在@ Ehsan-Sajjad提到的時候給它一個新的()約束。 – 2015-02-12 09:57:28

+0

@RaviMPatel我不能同意你的看法。在我們的例子中,默認總是會返回給我們一些東西,對於ref類型來說是null。我真的不喜歡把new()約束,因爲在某些情況下它會破壞設計。相反,默認是更寬容的 – 2015-02-12 10:14:24

+1

是的,但這意味着OnGo方法將**總是**爲空。如果該方法總是會變爲空,那麼有一個參數有什麼意義?再次,我假設TypeAsParam是一個引用類型,因爲委託的參數名稱是** obj **。 – 2015-02-12 10:34:46

1

它爲我通過它使用約束:

public delegate void OnGo<TypeInDel>(TypeInDel obj); 

     public class MyClass<TypeAsParam> where TypeAsParam : new() 
     { 
      public OnGo<TypeAsParam> MyDelegate; 

      public void Msg() 
      { 
       TypeAsParam msg = new TypeAsParam(); 
       MyDelegate(msg); 
      } 
     } 
0

顯然,這種方法已經指定類型的類內。這意味着你的泛型類的方法也是自動通用的。

public class MyClass<TypeAsParam> 
     { 
     public OnGo<TypeAsParam> MyDelegate; 

     public void Msg(TypeAsParam msg) 
     { 
      MyDelegate(msg); 
     } 
     } 
0

這是因爲它看到兩個單獨的聲明您的泛型類型TypeAsParam,並認爲它們是不同的東西。我還爲msg對象添加了一個默認值以避免次要編譯器錯誤。更改爲:

public delegate void OnGo<TypeInDel>(TypeInDel obj); 

public class MyClass<TypeAsParam> 
{ 
    public OnGo<TypeAsParam> MyDelegate; 

    public void Msg() 
    { 
     TypeAsParam msg = default(TypeAsParam); 
     MyDelegate(msg); //here is wrong in VS editor, says cannot cast msg to TypeAsParam(not TypeInDel) 
    } 
}