C#要在class中使用泛型委托也有泛型
C# To use generice type delegate in class also has generic type
我想制作一个接受 Type 作为参数的 class,与此同时,我想制作一个也是通用类型的委托。示例代码如下。我认为它应该工作,OnGo 委托从 class 声明中接收 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)
}
}
问题出在您的 Msg 方法上。您在其中定义了新的 TypeParameter,因此编译器无法确定 class 中的 TypeAsParam
和方法中的 TypeAsParam
相同。您需要从消息中删除 <TypeAsParam>
或进行一些限制。
此外,您需要像这样初始化消息:
var msg = default(TypeAsParam)
通过对其应用约束,它对我有用:
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);
}
}
显然这个方法在已经指定类型的 class 中。这意味着您的通用方法 class 也自动成为通用方法。
public class MyClass<TypeAsParam>
{
public OnGo<TypeAsParam> MyDelegate;
public void Msg(TypeAsParam msg)
{
MyDelegate(msg);
}
}
这是因为它看到了您的泛型类型 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)
}
}
我想制作一个接受 Type 作为参数的 class,与此同时,我想制作一个也是通用类型的委托。示例代码如下。我认为它应该工作,OnGo 委托从 class 声明中接收 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)
}
}
问题出在您的 Msg 方法上。您在其中定义了新的 TypeParameter,因此编译器无法确定 class 中的 TypeAsParam
和方法中的 TypeAsParam
相同。您需要从消息中删除 <TypeAsParam>
或进行一些限制。
此外,您需要像这样初始化消息:
var msg = default(TypeAsParam)
通过对其应用约束,它对我有用:
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);
}
}
显然这个方法在已经指定类型的 class 中。这意味着您的通用方法 class 也自动成为通用方法。
public class MyClass<TypeAsParam>
{
public OnGo<TypeAsParam> MyDelegate;
public void Msg(TypeAsParam msg)
{
MyDelegate(msg);
}
}
这是因为它看到了您的泛型类型 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)
}
}