指定泛型中T应该是接口。

3
我在考虑一种通用的方法,其中T应该是接口,但它可以是IFace的子类。
public static T Get<T>(SomeClass foo) where T : IFace {
  if(smthing)
    return Activator.CreateInstance(type, true);
}

所以我可以调用

Class.Get<IFace>(smth)
Class.Get<IFaceDescend>(smt)

但不是

Class.Get<Class2>(smt)

可能是重复的问题:如何将接口用作C#泛型类型约束? - ken2k
@ken2k 哦,是的,我没找到它,浪费了时间去问 :( - Zavael
2个回答

4
不,你不能这样做。你可以在执行时测试它:
if (!typeof(T).IsInterface)
{
    throw ...;
}

...但你不能将其表达为对T的编译时约束。


1
@Zavael,请查看我在重复问题的答案(https://dev59.com/AHNA5IYBdhLWcg3wF5uO#9164633),其中提供了一种方法,可以避免每次调用该方法时都检查`typeof(T).IsInterface`。 - phoog

4

在当前的C#中无法实现这一点。

唯一能做的就是在运行时验证这个事实,可以使用类似以下的代码:

if (!typeof(T).IsInterface) throw new ArgumentException("T must be an interface");

(注意,没有TypeArgumentException这个可能是更好的选择,我猜。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接