2015-02-12 80 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) 
    } 
}