![]() |
1
41
另一个更新: 这个问题是 the subject of my blog in July 2013 . 谢谢你的提问! 更新: 我已经考虑过了问题是你不想 遗传 完全。相反,你想要的是 必须放置在类型参数上的所有约束,以使该类型参数用作另一类型中的类型参数,从而自动推导并无形地添加到类型参数的声明中。 对? 一些简化示例:
u是一个类型参数,用于必须是c的上下文中。因此,在您看来,编译器应该推断出这一点,并自动对u施加c的约束。 这个怎么样?
现在v是一个在上下文中使用的类型参数,它必须同时是x和y。因此在您看来,编译器应该推断出这一点,并自动将x和y约束放在v上。是吗? 这个怎么样?
我只是编造出来的,但我向你保证这是一个完全合法的等级制度。请描述一个清晰且一致的规则,该规则不会进入无限循环以确定t、u和v上的所有约束。不要忘记处理已知类型参数是引用类型且接口约束具有协方差或反方差注释的情况。离子!而且,算法必须具有它所提供的属性 确切地 无论源代码中b、c和d的顺序是什么,结果都是一样的。 如果您希望使用约束推断功能,那么编译器必须能够处理这样的情况,并在无法处理时给出明确的错误消息。 基类型有什么特别之处?为什么不一直实现这个特性呢?
v是一个类型参数,用于必须转换为x的上下文中;因此编译器应该推断出这个事实,并对v设置x约束。是吗?还是没有? 为什么字段是特殊的?这个呢:
v是在上下文中使用的类型参数,它只能是int。因此c编译器应该推断出这个事实,并自动对v设置int约束。 对?没有? 你知道这是怎么回事吗?它停在哪里?为了正确地实现所需的特性,编译器必须进行整个程序分析。 编译器不做这种级别的分析,因为这是本末倒置。当你构造一个泛型时, 你 需要向编译器证明您已满足约束。编译器的工作不是弄清楚您要说什么,并弄清楚哪些进一步的约束集满足原始约束。 出于类似的原因,编译器也不会试图代表您自动推断接口中的差异注释。详情见我关于这个问题的文章。 原始答案:
只有 成员 是遗传的。约束不是成员。
你只是在断言某件事情应该如何,而没有提供任何解释 为什么? 应该是那样的。向我们解释为什么你认为世界应该是那样的;什么是 效益 什么是 弊端 什么是 成本 ?
不继承泛型约束。
默认情况下,“未实现”功能。我们不需要提供功能 不 实现了! 每个 直到有人花了钱来实现它,功能才被实现。 现在,我赶紧指出泛型类型约束 是 继承于 方法 . 方法是成员,成员是继承的,约束是方法的一部分(尽管不是方法的一部分 签名 )因此,当继承该约束时,该约束将随方法一起提供。当你说:
然后
但是d没有继承 T 我不明白怎么可能。M是 成员 是B的,由D及其约束继承。但是t本来就不是b的成员,那么还有什么可以继承呢? 我真的一点也不明白你想要什么样的功能。你能详细解释一下吗? |
![]() |
2
0
下面是一个场景,在该场景中,此行为的隐式性质导致不同于预期的行为: 我认识到这个场景在设置的数量上可能看起来很奢侈,但这只是这个行为可能导致问题的一个例子。软件应用程序可能很复杂,所以即使这个场景看起来很复杂,我也不会说这不可能发生。 在本例中,有一个运算符类实现了两个类似的接口:imonitor和iprocessor。两者都有start方法和isstarted属性,但operator类中每个接口的行为是独立的。即,在operator类中有一个monitorStarted变量和一个processorStarted变量。
假设有人更改了classbase的实现,以删除泛型参数t上iprocessor的类型约束,并将其替换为imonitor的类型约束。此代码将默默工作,但会产生不同的行为。原因是签入方法
|
![]() |
3
-1
我觉得你很困惑,因为你声明你的派生类
如果你想一想如果你用的是
那么如何确定
您还需要将约束添加到派生类泛型类型,以便
|
![]() |
4
-2
因为classbase在他的模板上有一个约束(应该按项目类型),所以您也必须将这个约束添加到myclass。 如果不这样做,可以创建myClass的新实例,其中模板不是项的类型。创建基类时,它将失败。 [编辑] 嗯,现在重新阅读你的问题,我看到你的代码编译了吗?好啊。 嗯,我是myClass,你不知道this.items的基类型,所以你不能调用check方法。 this.items属于IList类型,在您的类中,没有指定titem,这就是类不理解check方法的原因。 让我回答您的问题,为什么不将约束添加到MyClass类中?如果将任何其他类类型作为该类的模板,则会导致错误。为什么不通过添加一个约束来防止这个错误,这样它将使compiletime失败。 |