猿问

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

在 C++ 中,这是有效的。


template<class T> void func(T t)

{ t.method(); }

如何在 C# 中实现这一点?这是我尝试过的,但它不起作用。


void func<T>(T t)

{ t.method(); }

或者在 C# 中不可能做到这一点?


函数式编程
浏览 152回答 3
3回答

长风秋雁

以下应该工作public static class MyClass{&nbsp; public static void MyMethod<T>(T t) where T : class&nbsp; {&nbsp; &nbsp; &nbsp;t.ToString(); // Note: for this to work we need to KNOW the type which defines `method`.&nbsp; }}还有这个:public class MyBase{&nbsp; &nbsp;void Method();}public static class MyClassForBase{&nbsp; public static void MyMethod<T>(T t) where T : MyBase&nbsp; {&nbsp; &nbsp; &nbsp;t.Method(); // Note: anything from MyBase is now available&nbsp; }}最后但并非最不重要的一点是,您可以像这样使用后期绑定public static class MyClassDynamic{&nbsp; public static void MyMethod(dynamic t)&nbsp; {&nbsp; &nbsp; &nbsp;t.Method(); // Note: if t doesn't have a `Method` defined, the code will crush-n-burn at runtime&nbsp; }}

莫回无

在采用泛型参数的方法中,您只能在该参数上调用编译器知道将存在的方法。在您的示例中:void func<T>(T t){&nbsp; &nbsp; t.method();}编译器不知道该方法method存在,所以这不起作用。您可以通过使用约束来告诉编译器哪些方法可用。例如,如果该方法是在接口上定义的,那么您可以使用where如下子句正确约束它:pubic interface IClassWithMethod{&nbsp; &nbsp; void method();}void func<T>(T t) where T : IClassWithMethod{&nbsp; &nbsp; t.method();}

子衿沉夜

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++ 模板那样看待泛型。有一些非常根本的差异会让您更难看出何时何地可以/应该使用泛型。
随时随地看视频慕课网APP
我要回答