.net 类型约束是否可以是独占的而不是包含的?

.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)

我正在处理一个与VB.NET和多个通用接口相关的奇怪问题。我拥有的类通过指定两个不同的泛型类型参数实现了两次泛型接口。为了找到这个问题的解决方案(如下所列),我有一个想法,但找不到任何资源来看看这是否可行

这里的MSDN文档:解释类型约束的用法,这很有帮助,但不完整(或者至少语言不支持我想要的内容)

通常约束声明为:

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
      派生的类型,有一个非常怪异的角落)。为泛型寻找的约束类型需要进一步偏离正常的层次模型。