Bru*_*nez 13 .net c# generics casting interface
我想调用一个约束输入类型T的泛型方法来实现两个接口:
interface IA { }
interface IB { }
void foo<T>(T t) where T : IA, IB { }
Run Code Online (Sandbox Code Playgroud)
我怎样才能修复最后一行
void bar(object obj)
{
if (obj is IA && obj is IB)
{
foo((IA && IB)obj);
}
}
Run Code Online (Sandbox Code Playgroud)
?
反思可能允许拨打电话,但我希望保持在语言范围内.
您似乎误解了泛型如何工作:当调用具有泛型参数的方法时T,T必须在编译时静态地知道.虽然编译器有时可以推断它(因此您并不总是需要明确地将其写下来),但在调用方法时T 必须提供一些.在你的情况,你所知道的是,obj是IA和IB,但是这并没有给你足够的信息来调用foo<T>,因为你不知道什么T应该是.你要么必须使用反射,强制转换为特定的,它实现两个类型IA和IB,或做出更戏剧性的设计变更.
C# 4.0 动态关键字能让您(大部分)免费出狱吗?毕竟 - 你已经在进行类型检查了。
interface IC : IA, IB { }
void bar(object obj)
{
if (obj is IA && obj is IB)
{
IC x = (dynamic)obj;
foo(x);
}
}
Run Code Online (Sandbox Code Playgroud)
如果 foo 尝试将参数转换为 T ,这会中断吗?我不知道。