这会生成一个错误,指出我无法将类型转换ClassType
为T.这有什么解决方法吗?
有没有办法指定实际上可以转换为this can的类型T?
public void WorkWith<T>(Action<T> method)
{
method.Invoke((T)this);
}
Run Code Online (Sandbox Code Playgroud)
两种可能的解决方案:
不是类型安全的:
public void WorkWith<T>(Action<T> method)
{
method.Invoke((T)(object)this);
}
Run Code Online (Sandbox Code Playgroud)
这不是类型安全的,因为您可以向它传递任何具有单个参数且没有返回值的方法,例如:
WorkWith((string x) => Console.WriteLine(x));
Run Code Online (Sandbox Code Playgroud)
类型安全“版本”(使用通用约束):
public class MyClass
{
public void WorkWith<T>(Action<T> method) where T : MyClass
{
method.Invoke((T)this);
}
}
Run Code Online (Sandbox Code Playgroud)
这里的要点是,为了能够强制转换this为T,编译器希望确保this始终可强制转换为T(因此需要约束)。如非类型安全示例所示,与泛型一起使用的“经典”(不安全)解决方案是通过强制转换传递给object.