0

Java中的以下代码在c#中是否有等价物

List<? extends Number> list;
list = new ArrayList<Float>();
list = new ArrayList<Integer>();
list.add(Float.valueOf("4.0")); // doesn't compile and it is fine
Number e = list.get(0); // workds

我正在阅读 C# 中的协变类型

List<SomeClass> list2 = new List<SomeClass>();
IEnumerable<Object> list3 = list2; // works

据我了解,Java 中的所有接口/类默认都支持协方差。根据声明中使用的类型参数,不支持不遵循协方差的特性(将参数化类型作为输入的方法)。意思List<? extends Number> 是,可以引用List<Integer> or a List<Double>,但不再支持 add() 之类的方法。

现在,在C#的另一边,看起来我需要找到一个支持协方差的接口然后使用它。所以,每当我想编写一些泛型类时,我必须编写一个单独的接口来支持所有派生类的所有协变操作,并确保我的类实现该接口?这是正确的还是我错过了什么。

谢谢

4

1 回答 1

1

您的问题,
C# 中是否有 Java 中以下代码的等价物

    List<? extends Number> list;
    list = new ArrayList<Float>();
    list = new ArrayList<Integer>();
    list.add(Float.valueOf("4.0")); // doesn't compile and it is fine
    Number e = list.get(0); // workds

不,直接没有等效项,因为“数字”没有基类或超类或接口,但有一个等效项(类似于“?”运算符),即 where 关键字。

您可以在有关它的msdn 页面上获得有关它的更多信息。

您可以对类中的变量执行此内联操作,如下所示:

public class ArrayList<T> where T: someBaseClass
{
   List<T> list = new List<DerivedTypeOfSomeBaseClass>();
}

或在函数内部

public T getArrayList<T>(ArrayList<T> arr) where T: someBaseClass
List<T> list = new List<DerivedTypeOfSomeBaseClass>()

你的问题

现在,在C#的另一边,看起来我需要找到一个支持协方差的接口然后使用它。所以,每当我想编写一些泛型类时,我必须编写一个单独的接口来支持所有派生类的所有协变操作,并确保我的类实现该接口?这是正确的还是我错过了什么

协变和逆变的一般概念指出,协变是使用比泛型参数指定的更多派生类型的能力,而逆变是使用派生较少类型的能力。
有关协变和逆变的详细说明,您可以阅读MSDN 链接
所以,如果你想通过通用方式做这件事,你是对的,你必须有一个支持所有协变操作的通用基础接口。

在您针对数字的特定情况下,C# 中的所有 Byte、Double、Float、Integer、Long、Short 都实现了 IComparable、IFormattable、IConvertible、IComparable、IEquatable 接口,所以对于您的第一个问题,

 public class Program<K> where K : IComparable, IFormattable, IConvertible, IComparable<K>, IEquatable<K>
{
  static void Main()
  {  
        Program<int> pro = new Program<int>();
        Program<Byte> bpro = new Program<Byte>();
        Program<Double> dpro = new Program<Double>();
        Program<Int64> fpro = new Program<Int64>();
        Program<long> lpro = new Program<long>();
        Program<short> spro = new Program<short>();
   }
于 2013-10-19T11:28:36.857 回答