Java在C#中绑定了通配符

时间:2016-11-16 09:36:42

标签: java c# .net generics bounded-wildcard

我已经坚持这个问题几个小时了。我正在尝试为C#找到一个等效的方法。

Java ,有效:

public class Main
{
  public static void main(String[] args)
  {
    ArrayList<BaseList<? extends Base>> list = new ArrayList<>();
    list.add(new DerivedList());
  }
}

public class BaseList<T extends Base>
{

}

public class Base
{

}

public class DerivedList extends BaseList<Derived>
{

}

public class Derived extends Base
{

}

我需要在C#中使用ArrayList<BaseList<? extends Base>>的等效方法。我希望有人帮助我。

在C#中是否可以将变量通配符?

2 个答案:

答案 0 :(得分:1)

C#使用运行时类型实现,而Java使用类型擦除。这意味着在Java中,case WM_KILLFOCUS: { //tried below all options ::BringWindowToTop(hWnd): ::SetForegroundWindow(hWnd); ::SetFocus(hWnd); ::SetActiveWindow(hWnd); } 在运行时与ArrayList<Foo>是同一个类。这是不是在C#中的情况,所以你不能像这样丢弃类型参数。

您可以尝试解决这个问题:

ArrayList<Bar>

然后使用public abstract class BaseList { } public class BaseList<T> : BaseList where T : Base { }

答案 1 :(得分:1)

你不能完全按照你的描述那样做,但有一些解决方法。一个在另一个答案中提到,另一个是使用接口代替:

public class Main
{
    public static void main(String[] args)
    {
        var list = new List<IBaseList<Base>>();
        list.Add(new DerivedList());
    }
}
// note "out" here
public interface IBaseList<out T> where T : Base {

}

public class BaseList<T> : IBaseList<T> where T : Base {

}

public class Base {

}

public class DerivedList : IBaseList<Derived> {

}

public class Derived : Base {

}