接口的通用类型约束?

4
我可以做到这一点:
void MyMethod<T>() where T : class { }

有类似的内容吗?
void MyMethod<T>() where T : interface { }

我更倾向于不明确指定接口名称。

另一种方法是我可以传入一个由class限制的参数,并在typeof(T).IsInterface返回false时抛出异常,但这不如使用约束条件简洁。


2
这听起来像是一个XY问题的解决方案 - 你能展示更多你想通过这样做解决什么问题吗? - James Thorpe
1
这个限制的目的是什么? - D Stanley
可能是重复的问题:如何将接口用作C#泛型类型约束? - Ivan Danilov
1个回答

2

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

class约束意味着类型参数必须是引用类型。

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

接口本身只是方法/属性的声明,所以约束“某物是接口”字面上意味着“某物有一些声明”-这是无用的。


3
知道吗,你说得对。接口本身无法实例化,因此永远不会传递“仅”是接口的内容。但愿我能删除这个问题。 - oscilatingcretin
所有接口类型必须是引用类型。 - Servy
3
回答是错误的:这会将T限制为接口类型。因此,MyMethod<IDisposable>()MyMethod<IEnumerable<string>>可以正常工作,而MyMethod<string>()不行。楼主是正确的,这个约束在C#中现在不存在。但真正的问题是:这样的特性是否真的有用?我想不到一个使用案例。 - Falanwe
@Falanwe 这个答案实际上是正确的。接口不能单独存在为实例。另一个类必须实现接口,以便它在合同定义之外具有任何实质性内容。我最初是在寻找一种枚举程序集中所有类型并获取实现特定接口的类型的方法。我需要传入一系列类型,然后验证它们是否为接口类型,否则会抛出异常。 - oscilatingcretin
2
@Falanwe 我同意,这是一个错误的答案。甚至有一些真实的情况下,这是必要的。例如,如果您想代理实现某个接口的实例 - 使用接口类型作为T,您可以确定您可以很好地代理所有内容。但是,如果有人在那里提供密封类或具有非虚方法的类 - 代码将在运行时失败。 - Ivan Danilov
显示剩余4条评论

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