【发布时间】:2013-01-08 13:36:13
【问题描述】:
我有以下代码:
public class EntityFilter<T>
{}
public interface IEntity
{}
public class TestEntity : IEntity
{}
class Program
{
static void Main(string[] args)
{
var ef = new EntityFilter<TestEntity>();
DoSomething((EntityFilter<IEntity>)ef); // <- casting fails
}
public static void DoSomething(EntityFilter<IEntity> someEntityFilter)
{
}
}
Visual Studio 说:
Cannot convert type 'ConsoleApplication1.EntityFilter<ConsoleApplication1.TestEntity>' to 'ConsoleApplication1.EntityFilter<ConsoleApplication1.IEntity>'
我无法将 DoSomething 方法转换为通用方法并接受 EntityFilter<T>,因为在我的应用程序中,在 DoSomething 调用时 T 的类型是未知的。稍后将在 DoSomething 内部使用反射确定类型。
如何在不使 DoSomething 方法泛型的情况下将 ef 变量传递给 DoSomething 方法?
【问题讨论】:
-
为什么不能将
ef创建为EntityFilter<IEntity>? -
为什么你不能让你的方法通用?这是正确的做法:
method<T>(EntityFilter<T> ef) where T : IEntity -
“不起作用”是什么意思?请提供有关您遇到的错误的信息。
-
@Martin,如果你这样做
DoSomething<T>(EntityFilter<T> someEntity) where T : IEntity,你绝对不会失去任何东西。打电话时根本不需要指定T。T正确推断为TestEntity -
@nawfal:哦,谢谢,你是对的。看来,这次推理可以解决问题,所以我不需要那种丑陋的强制转换,同时我也不必为 DoSomething 明确指定 T。
标签: c# generics interface type-conversion derived