【问题标题】:Generic type constraint for interface?接口的通用类型约束?
【发布时间】:2016-01-20 15:21:27
【问题描述】:

我可以这样做:

void MyMethod<T>() where T : class { }

有这样的吗?

void MyMethod<T>() where T : interface { }

我不想明确指定接口名称。

另一种方法是,我可以传入一个受class 约束的参数,如果typeof(T).IsInterface 返回false,则抛出异常,但这不如约束那么干净。

【问题讨论】:

标签: c# .net generics generic-constraints


【解决方案1】:

这没有任何意义,因为它不会导致任何限制。

约束class表示类型参数必须是引用类型。

那么interface 没有明确的接口名称应该限制什么?

接口本身只是方法/属性的声明,因此约束“某物是接口”的字面意思是“某物有一些声明”——这是无用的。

【讨论】:

  • 你知道吗,你是对的。不能有接口的实例,因此不会传入任何only 接口。要是我能删除这个问题就好了。
  • 所有接口类型必须是引用类型。
  • 答案是错误的:它会将T 限制为接口类型。所以MyMethod&lt;IDisposable&gt;()MyMethod&lt;IEnumerable&lt;string&gt;&gt; 可以正常工作,而MyMethod&lt;string&gt;() 不行。 OP 是对的,这个约束现在在 C# 中不存在。但真正的问题是:这样的功能真的有用吗?我想不出一个用例。
  • @Falanwe 这个答案实际上是正确的。接口不能单独作为实例存在。另一个类必须实现该接口才能使其具有合同定义之外的任何内容。我最初是在寻找一种方法来枚举我的程序集中的所有类型并获取那些实现特定接口的类型。我需要传入一系列类型,然后验证它们是接口类型,否则抛出异常。
  • @Falanwe 我第二,这是一个不正确的答案。甚至有必要的真实案例。例如,如果您想代理实现某个接口的实例 - 接口类型为 T 您可以确定您可以代理一切都很好。但是,如果有人在那里提供密封类或具有非虚拟方法的类 - 代码将在运行时惨遭失败。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-20
  • 1970-01-01
  • 2017-08-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多