我有以下界面

public interface IRevision<TRevisionType>
{ ... }

public interface IRevisionLog
{ ... }

public interface IRevisionControl<in TRevision, TLogType,T>
  where TRevision : IRevision<T>
  where TLogType : IRevisionLog
{ ... }


这段代码可以很好地编译,但是我想知道,是否真的需要最后一个T?
当我实现IRevision时,我将传递类型T,因此实际上不需要重复类型。

我的演示实现为:

public class HgRevision : IRevision<string>
{ ...}

public class HgLog : IRevisionLog
{ ... }

public class Hg : IRevisionControl<HgRevision, HgLog, string>


我两次传递字符串。我想知道我是否可以做这样的事情:

public interface IRevisionControl<in TRevision, TLogType>
  where TRevision : IRevision
  where TLogType : IRevisionLog
{ ... }


所以我的汞会是:

public class Hg : IRevisionControl<HgRevision, HgLog>


当然,这最后一个代码段不会编译。

最佳答案

这段代码可以很好地编译,但是我想知道,是否真的需要最后一个T?


是的,假设您实际上需要对TRevision的约束。如果您不这样做,那很好...但是,如果您这样做,则需要能够指定必须转换为哪个IRevision<T>

一种选择是为IRevision<>创建基本接口:

public interface IRevision
{
    // Include any members which don't depend on TRevisionType
}

public interface IRevision<TRevisionType> : IRevision
{
    // The rest
}


然后,您可以使用:

public interface IRevisionControl<in TRevision, TLogType>
  where TRevision : IRevision
  where TLogType : IRevisionLog


...但是,当然,您将不能再使用IRevision<>中声明的任何成员-仅使用非通用基本接口中的成员。

10-07 20:32