Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 删除接口中的冗余类型_C#_.net_Generics_Interface - Fatal编程技术网

C# 删除接口中的冗余类型

C# 删除接口中的冗余类型,c#,.net,generics,interface,C#,.net,Generics,Interface,我有以下接口 public interface IRevision<TRevisionType> { ... } public interface IRevisionLog { ... } public interface IRevisionControl<in TRevision, TLogType,T> where TRevision : IRevision<T> where TLogType : IRevisionLog { ... }

我有以下接口

public interface IRevision<TRevisionType>
{ ... }

public interface IRevisionLog
{ ... }

public interface IRevisionControl<in TRevision, TLogType,T>
  where TRevision : IRevision<T> 
  where TLogType : IRevisionLog
{ ... }
公共接口IRevision
{ ... }
公共接口IRevisionLog
{ ... }
公共接口iVisionControl
TRevision在哪里:IRevision
其中TLogType:IRevisionLog
{ ... }
这段代码编译得很好,但我想知道,最后一段代码真的不需要吗? 当我实现IRevision时,我将传递类型T,所以实际上不需要复制类型

我的演示实现是:

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

public class HgLog : IRevisionLog
{ ... }

public class Hg : IRevisionControl<HgRevision, HgLog, string>
public class Hg : IRevisionControl<HgRevision, HgLog>
公共类HG修订版:IRevision
{ ...}
公共类HgLog:IRevisionLog
{ ... }
公共类Hg:IRevisionControl
我把绳子传了两次。我想知道我是否可以这样做:

public interface IRevisionControl<in TRevision, TLogType>
  where TRevision : IRevision
  where TLogType : IRevisionLog
{ ... }
公共接口iVisionControl
TRevision在哪里:IRevision
其中TLogType:IRevisionLog
{ ... }
所以我的Hg应该是:

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

public class HgLog : IRevisionLog
{ ... }

public class Hg : IRevisionControl<HgRevision, HgLog, string>
public class Hg : IRevisionControl<HgRevision, HgLog>
public类Hg:IRevisionControl
当然,最后一个代码段不会编译

这段代码编译得很好,但我想知道,最后一段代码真的不需要吗

是的,假设您确实需要
TRevision
上的约束。如果你没有,那很好。。。但是如果您这样做,您需要能够指定必须转换到哪个
IRevision

一个选项是为IRevision创建一个基本接口:

公共接口IRevision
{
//包括任何不依赖TRevisionType的成员
}
公共界面IRevision:IRevision
{
//其余的
}
然后您可以使用:

public interface IRevisionControl<in TRevision, TLogType>
  where TRevision : IRevision 
  where TLogType : IRevisionLog
公共接口iVisionControl
TRevision在哪里:IRevision
其中TLogType:IRevisionLog
。。。但是当然,您将无法使用在
IRevision
中声明的任何成员-仅使用非泛型基本接口中的成员

这段代码编译得很好,但我想知道,最后一段代码真的不需要吗

是的,假设您确实需要
TRevision
上的约束。如果你没有,那很好。。。但是如果您这样做,您需要能够指定必须转换到哪个
IRevision

一个选项是为IRevision创建一个基本接口:

公共接口IRevision
{
//包括任何不依赖TRevisionType的成员
}
公共界面IRevision:IRevision
{
//其余的
}
然后您可以使用:

public interface IRevisionControl<in TRevision, TLogType>
  where TRevision : IRevision 
  where TLogType : IRevisionLog
公共接口iVisionControl
TRevision在哪里:IRevision
其中TLogType:IRevisionLog

。。。但是当然,您将无法使用在
IRevision
中声明的任何成员-仅使用非通用基本界面中的成员。

您确定在
IRevisionControl
声明中需要
TRevision
?我的意思是,这在类声明中是有意义的,因为类方法中的一些代码只能与特定的
TRevision
一起工作,但在接口中,这可能就足够了:

public interface IRevisionControl<TRevisionType, TLogType>
  where TLogType : IRevisionLog
{
     void Foo(IRevision<TRevisionType> revision);
}
公共接口iVisionControl
其中TLogType:IRevisionLog
{
void Foo(IRevision修订版);
}

您确定在
iVisionControl
的声明中需要
TRevision
?我的意思是,这在类声明中是有意义的,因为类方法中的一些代码只能与特定的
TRevision
一起工作,但在接口中,这可能就足够了:

public interface IRevisionControl<TRevisionType, TLogType>
  where TLogType : IRevisionLog
{
     void Foo(IRevision<TRevisionType> revision);
}
公共接口iVisionControl
其中TLogType:IRevisionLog
{
void Foo(IRevision修订版);
}

使用此模式,我无法强制从IRevision实现TRevisionType根据您的代码,
TRevisionType
不应从
IRevision
实现,它是
IRevision
的类型参数。我遗漏了什么吗?你说得对,打字错误。我想让IRevision实现TRevision。我想在我的IRevisionControl实现中使用具体类型。Skeet的方法是可以的。使用这种模式,我不能强制从IRevision实现TRevisionType。根据您的代码,
TRevisionType
不应该从
IRevision
实现,它是
IRevision
的类型参数。我遗漏了什么吗?你说得对,打字错误。我想让IRevision实现TRevision。我想在我的IRevisionControl实现中使用具体类型。Skeet的方法是可以的。我完全知道这个解决方案的局限性,但我会在我的Hg类中使用具体类型的HgRevision,所以这是可以的。谢谢我完全了解这个解决方案的局限性,但我将在我的Hg类中使用具体类型的HgRevision,所以这是可以的。谢谢