C#在类中使用泛型类型委托也具有泛型类型

时间:2015-02-12 09:24:04

标签: c# generics delegates

我想创建一个接受Type作为参数的类,同时,我想创建一个也是泛型类型的委托。示例代码如下。我认为它应该工作,OnGo委托从类声明接收Type作为TypeAsParam。但是,注释行是错误的。有人知道如何解决这个问题吗?谢谢大家:)

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)
    }
}

4 个答案:

答案 0 :(得分:5)

问题在于你的Msg方法。在其中您定义了新的TypeParameter,因此编译器无法确保来自类的TypeAsParam和来自方法的TypeAsParam是相同的。您需要从消息中删除<TypeAsParam>或制定一些约束。

另外,你需要像这样初始化你的消息:

var msg = default(TypeAsParam)

答案 1 :(得分: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); 
            }
        }

答案 2 :(得分:0)

显然,此方法位于已指定类型的类中。这意味着您的泛型类的方法也是自动泛型的。

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

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

答案 3 :(得分: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)
    }
}