C# c省略嵌套类型参数

C# c省略嵌套类型参数,c#,list,constructor,type-parameter,C#,List,Constructor,Type Parameter,我想创建一个操作类,其中包含一个函数,该函数将数据作为输入,并将数据作为输出: public abstract class Data { } public abstract class Operation { public abstract Data Run (Data input); } 我希望不同的数据输出比数据输入具有灵活性: 最后,我想强制所有数据实现某种类型的列表: public abstract class Data<T> : List<T> {

我想创建一个操作类,其中包含一个函数,该函数将数据作为输入,并将数据作为输出:

public abstract class Data { }

public abstract class Operation {
    public abstract Data Run (Data input);
}
我希望不同的数据输出比数据输入具有灵活性:

最后,我想强制所有数据实现某种类型的列表:

public abstract class Data<T> : List<T> { }

public abstract class Operation<T1, T2>
  where T1: Data // Error
  where T2: Data // Error
{

  public abstract T2 Run (T1 input);
}
然后我得到了一个错误:使用泛型类型“Data”需要1个类型参数

在where子句中不显式设置数据类型的情况下,如何解决此错误

理想情况下,您希望使用以下代码:

public class Operation <????> { ???? }

public class Data<T> : List<T> {}
public class Foo {}
public class FooData : Data<Foo> {}
public class Bar {}
public class BarData : Data<Bar> {}

public class FBOperation : Operation<FooData, BarData> {
  public override BarData Run (FooData input) {
    return ...; 
  }
}

我应该如何实现Operation类?

您可以这样做:

public class Foo { }


public class Bar { }


public interface IData { }


public interface IData<T> : IData
{
    List<T> List{ get; set; }
}


public class Foos : IData<Foo>
{
    public List<Foo> List{ get; set; }
}


public class Bars : IData<Bar>
{
    public List<Bar> List{ get; set; }
}


public abstract class Operation<TD1, TD2>
    where TD1 : IData
    where TD2 : IData
{
    public abstract TD2 Run(TD1 input);
}


public class FbOperation : Operation<Foos, Bars>
{
    public override Bars Run(Foos input)
    {
        // TODO
        return new Bars();
    }
}

问题在于,您不再有数据类型,您已经向它添加了一个泛型参数t,并且得到了一个完全不同的数据类型,因此T1:Data的约束是不正确的

最简单的解决方案是将此附加参数传播到操作类型

但事情对我来说有点太复杂了。考虑一下在操作类中添加这些非常严格的限制有什么好处是有道理的。 此基本版本可能足以描述一系列操作类型

public abstract class Operation<T1, T2>
{
    public abstract T2 Run (T1 input);
}

如果有四个类型参数呢?i、 e.操作和T1:数据和T2:数据的位置?那合适吗?我开始写答案,但你对泛型的使用相当混乱。此外,我还建议您阅读将我的FBOperation实现更改为:FBOperation:运行非常好的操作不要误解我的意思,但在我看来,我不应该同时提供FooData/Foo,因为Foo已经内置在FooData中,同样适用于barIt,在我看来,我不应该同时提供FooData/Foo,因为Foo是已经内置了FooData,barI修改了我的代码,所以只有2个通用参数。
public abstract class Operation<T1, T2, TItem>
  where T1: Data<TItem> 
  where T2: Data<TItem> 
{

  public abstract T2 Run (T1 input);
}
public abstract class Operation<T1, T2>
{
    public abstract T2 Run (T1 input);
}