I want to create an Operation class with a function that takes Data as input and provides Data as output:
public abstract class Data { }
public abstract class Operation {
    public abstract Data Run (Data input);
}
I want the flexibility of different Data output than Data input:
public abstract class Data { }
public abstract class Operation<T1, T2>
  where T1: Data
  where T2: Data
{
  public abstract T2 Run (T1 input);
}
Lastly, I want to force all Data to implement a List of some type:
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);
}
Then I get the error: "Using the generic type 'Data' requires 1 type arguments".
How am I supposed to resolve this Error without explicitly setting a type of Data in the where clause?
Ideally want to have the following code work:
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 ...; 
  }
}
How am I supposed to implement the Operation class?
 
    