指定泛型,其中 T 应该是接口

发布于 2025-01-03 18:27:47 字数 372 浏览 2 评论 0原文

我正在考虑一种通用方法,其中 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)

I was thinking of a generic method where T should be interface but it can be the descendant of IFace

public static T Get<T>(SomeClass foo) where T : IFace {
  if(smthing)
    return Activator.CreateInstance(type, true);
}

so i can call

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

but not

Class.Get<Class2>(smt)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

江南烟雨〆相思醉 2025-01-10 18:27:47

不,你不能这样做。您可以在执行时测试它:

if (!typeof(T).IsInterface)
{
    throw ...;
}

...但您不能将其表示为 T 上的编译时约束。

No, you can't do this. You can test for it at execution time:

if (!typeof(T).IsInterface)
{
    throw ...;
}

... but you can't express it as a compile-time constraint on T.

并安 2025-01-10 18:27:47

这在当前的 C# 中是不可能的。

您唯一能做的就是在运行时验证事实,使用类似的东西

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

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

This is not possible in current C#.

The only thing you can do is to validate the fact on runtime, using something like

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

(Note that there is no TypeArgumentException which might be a better choice, I guess.)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文