我想我的第一个问题是为什么这甚至可以编译?
您认为它违反了规范中的哪条规则?
在我看来,它正在实现一个尚未定义的类。
我认为您必须指定每个术语的确切含义,才能判断该语句是否准确。编译器知道CompositePresentationEvent
它是在其他地方声明的(大概),它知道是SomeEvent
因为那是被声明的类。这就像Foo
在一个类中有一个类型的字段Foo
- 完全有效。
能够做到这一点也非常有用——尤其是用于比较。例如:
public sealed class Foo : IComparable<Foo>
表示类的任何实例都Foo
知道如何将自己与另一个实例进行比较,因此它可以用于以类型安全的方式进行排序。在结构的情况下,这还允许您减少装箱,因为当已知是适当实现的类型时,调用x.CompareTo(y)
将不需要任何装箱。x
IComparable<>
请注意,类型可以变得更加有趣和令人困惑的递归。从我的 Protocol Buffers 端口中获取这个(稍作修改)示例:
public interface IMessage<TMessage, TBuilder>
where TMessage : IMessage<TMessage, TBuilder>
where TBuilder : IBuilder<TMessage, TBuilder>
public interface IBuilder<TMessage, TBuilder>
where TMessage : IMessage<TMessage, TBuilder>
where TBuilder : IBuilder<TMessage, TBuilder>
在这里,目标是基本上以两种类型结束 - “消息”和“构建器”,以便您始终可以从另一个构建每个类型。例如:
public class Foo : IMessage<Foo, FooBuilder>
{
...
}
public class FooBuilder : IBuilder<Foo, FooBuilder>
{
...
}