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

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

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++ 模板那样看待泛型。有一些非常根本的差异会让您更难看出何时何地可以/应该使用泛型。
- 3 回答
- 0 关注
- 151 浏览
添加回答
举报