我想创建一个接受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)
}
}
答案 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)
}
}