c#省略嵌套类型参数

问题描述 投票:0回答:2

我想用一个函数创建一个Operation类,该函数将Data作为输入并提供Data作为输出:

public abstract class Data { }

public abstract class Operation {
    public abstract Data Run (Data input);
}

我希望不同数据输出的灵活性比数据输入:

public abstract class Data { }

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

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

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);
}

然后我得到错误:“使用泛型类型'数据'需要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类?

c# list constructor type-parameter
2个回答
1
投票

你可以这样做:

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();
    }
}

0
投票

问题在于你不再使用Data类型,你已经为它添加了一个通用参数T并得到了一个完全不同的类型Data<T>,因此约束where T1: Data不正确。

最直接的解决方案是将此附加参数传播到Operation类型。

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

  public abstract T2 Run (T1 input);
}

但事情对我来说有点太复杂了。考虑在你的Operation<,>课程中加入那些相当重的限制有什么好处是有道理的。此基本版本可能足以描述一系列操作类型。

public abstract class Operation<T1, T2>
{
    public abstract T2 Run (T1 input);
}
© www.soinside.com 2019 - 2024. All rights reserved.