为了账号安全,请及时绑定邮箱和手机立即绑定

C++ 模板与具有各种参数的 C# 泛型方法

C++ 模板与具有各种参数的 C# 泛型方法

C#
函数式编程 2022-06-18 16:29:33
在 C++ 中,这是有效的。template<class T> void func(T t){ t.method(); }如何在 C# 中实现这一点?这是我尝试过的,但它不起作用。void func<T>(T t){ t.method(); }或者在 C# 中不可能做到这一点?
查看完整描述

3 回答

?
长风秋雁

TA贡献1757条经验 获得超7个赞

以下应该工作


public static class MyClass

{

  public static void MyMethod<T>(T t) where T : class

  {

     t.ToString(); // Note: for this to work we need to KNOW the type which defines `method`.

  }

}

还有这个:


public class MyBase

{

   void Method();

}


public static class MyClassForBase

{

  public static void MyMethod<T>(T t) where T : MyBase

  {

     t.Method(); // Note: anything from MyBase is now available

  }

}

最后但并非最不重要的一点是,您可以像这样使用后期绑定


public static class MyClassDynamic

{

  public static void MyMethod(dynamic t)

  {

     t.Method(); // Note: if t doesn't have a `Method` defined, the code will crush-n-burn at runtime

  }

}


查看完整回答
反对 回复 2022-06-18
?
莫回无

TA贡献1865条经验 获得超7个赞

在采用泛型参数的方法中,您只能在该参数上调用编译器知道将存在的方法。


在您的示例中:


void func<T>(T t)

{

    t.method();

}

编译器不知道该方法method存在,所以这不起作用。


您可以通过使用约束来告诉编译器哪些方法可用。例如,如果该方法是在接口上定义的,那么您可以使用where如下子句正确约束它:


pubic interface IClassWithMethod

{

    void method();

}


void func<T>(T t) where T : IClassWithMethod

{

    t.method();

}


查看完整回答
反对 回复 2022-06-18
?
子衿沉夜

TA贡献1828条经验 获得超3个赞

C# 中的泛型与 C++ 中的模板不同。C++ 模板本质上是在编译时应用于代码的宏,具体取决于它们所使用的类型。所以如果你试图在一个没有.method()方法的类上使用你的模板,它会在编译时失败。


相反,C# 泛型要求任何类型T 都必须定义泛型方法使用的任何方法和属性。因此,如果您有一个定义.method()方法的基本类型或接口,您可以将泛型方法限制为该类型:


void func<T>(T t) where T:IHaveMethod

{ t.method(); }

只要IHaveMethod接口定义了method(),泛型函数就会编译。请注意,在您的具体示例中,通用方法是无用的,因为您可以只调用method接口类型。


当您希望返回类型基于输入类型时,泛型更有用:


T func<T>(T t) where T:IHaveMethod

{ t.method(); return t;}

现在,不仅method被调用,而且返回类型正是泛型参数的类型,而不仅仅是 an IHaveMethod,这可能会限制您可以在不强制转换的情况下使用 return 执行的操作。


最重要的是,不要像看待 C++ 模板那样看待泛型。有一些非常根本的差异会让您更难看出何时何地可以/应该使用泛型。


查看完整回答
反对 回复 2022-06-18
  • 3 回答
  • 0 关注
  • 151 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号