.net 类型约束是否可以是独占的而不是包含的?
我正在处理一个与VB.NET和多个通用接口相关的奇怪问题。我拥有的类通过指定两个不同的泛型类型参数实现了两次泛型接口。为了找到这个问题的解决方案(如下所列),我有一个想法,但找不到任何资源来看看这是否可行 这里的MSDN文档:解释类型约束的用法,这很有帮助,但不完整(或者至少语言不支持我想要的内容) 通常约束声明为:.net 类型约束是否可以是独占的而不是包含的?,.net,vb.net,generics,type-constraints,.net,Vb.net,Generics,Type Constraints,我正在处理一个与VB.NET和多个通用接口相关的奇怪问题。我拥有的类通过指定两个不同的泛型类型参数实现了两次泛型接口。为了找到这个问题的解决方案(如下所列),我有一个想法,但找不到任何资源来看看这是否可行 这里的MSDN文档:解释类型约束的用法,这很有帮助,但不完整(或者至少语言不支持我想要的内容) 通常约束声明为: Public Interface ICopiesFrom(Of TObject As Class) Sub CopyFrom(ByVal data As TObject)
Public Interface ICopiesFrom(Of TObject As Class)
Sub CopyFrom(ByVal data As TObject)
End Interface
但是假设我想排除一个可能的泛型类型参数,而不是限制为一个子集
Public Sub Interface ICopiesFrom(Of TObject Not As SpecificBadType)
这能做到吗
这看起来像:是一个重复,但我的问题有点不同,因为我想要编译时支持
编辑:
Public Interface ICopiesFrom(Of TObject As Class)
Sub CopyFrom(ByVal data As TObject)
End Interface
下面是一个示例用例(如果可能的话):
在上面的场景中,我永远不希望有人能够将DetailedAccountModel
传递到User
类中,这样它就不会“意外”显示出来,理想情况下,这将在编译时捕获
以下任何一项都是可接受的答案:
- 实现这一目标的方法
- 实现相同结果(或类似结果)的替代方法
- 确认我疯了,这是无法做到的(当然有消息来源)
- 不,没有办法做到这一点。您可以将其作为语言特性,但我认为语言创建者认为这会鼓励人们编写违反开放/封闭原则的代码
例如,您现在可能知道有一个特定的类不应该用作泛型类型,但是如何阻止其他人提出另一个您现在不知道的类型呢。您试图排除特定类型的事实是一种代码气味,这可能表明有另一种更好的方法来解决您试图解决的问题。也许您使用的是继承,而您应该使用组合。也许您可以通过分离接口或使用更好的关注点分离来获益。也许通过不包含此功能,该语言实际上帮助我们编写了更多可维护的代码。约束的要点是告诉编译器约束类型的成员(方法/属性等)是有效的,因此您可以使用它们,因此简短的回答是否,而不是您试图使用它们的方式。向我们展示您希望在两个不同约束的实现中执行的操作。@ClickRick我已经用一个示例用法更新了我的问题。我认为不是这样possible@ClickRick:让类型
Foo
同时实现IFoo
和IFoo
怎么样?禁止使用,因为U
和V
可能是同一类型,在这种情况下IFoo
和IFoo
将是同一类型,但可能有冲突的方法定义。我认为这不会违反打开/关闭原则,特别是当约束的目的是指示某些类型参数不会统一时。例如,目前一个类不能同时实现IFoo
和IFoo
,除非编译器知道T
派生自某个类,而SomeClass
却不这样做。我认为这种约束的根本困难在于……存储位置类型被假定为与对象实例类型占用相同的范围,具有相同的层次结构,而不是一些特定的褶皱(例如,从ValueType
派生的类型的存储位置在它们自己的怪异世界中,对于那些从Nullable
派生的类型,有一个非常怪异的角落)。为泛型寻找的约束类型需要进一步偏离正常的层次模型。