繁体   English   中英

Java列表 <?> 在C#中

[英]Java List<?> in C#

有什么方法可以在C#中获取Java List<?>

我需要获得IEnumerable<T> ,其中T可以是class (字符串)或struct (int,double ...)。

public interface I
{
    IEnumerable<object> Enumers { get; }
}

public class A<T> : I
{
    IEnumerable<T> ts;

    public IEnumerable<object> Enumers
    {
        get { return (IEnumerable<object>)this.ts; }
    }
}

public class Test
{
    public static void Main()
    {
        A<double> a = new A<double>();
        var x = a.Enumers;  //It crashes here.
    }
}

由于无法从IEnumerable<T>IEnumerable<object> ,因此它在运行时崩溃。

有任何想法吗?

您需要获取一个其他IEnumerable,其元素的类型如下:

IEnumerable<object> Enumers
{
    get { return this.ts.Cast<object>(); }
}

在C#中,有一种叫做Boxing的东西,我猜想这对于T结构是如何工作的,尽管我没有检查。

IEnumerable<T>继承自IEnumerable ,因此根据您的实际需要,您有两个选择:将返回类型更改为IEnumerable

IEnumerable Enumers { get; }

或将集合中的所有元素都转换为object

public IEnumerable<object> Enumers
{
    get { return ts.Cast<object>(); }
}

像Java中一样,C#中没有通配符<?>

但是,通过使用dynamic语言和特定于语言的内容,您还可以处理此类问题:请参阅( C#泛型:通配符

就像其他用户指出的那样,您可以使用Cast功能来解决您的问题。

public IEnumerable<object> Enumers
{
    get { return ts.Cast<object>(); }
}

在.NET CLR中,类型参数的处理方式非常不同,具体取决于它是引用类型(例如object )还是值类型(例如double )。 本质上,所有参照类型变量都是大小相同的指针,而所有值类型变量恰好是值类型的大小。

实际上,CLR会生成一个单一的运行时类型,该运行时类型适用于您可以为类型参数指定的所有引用类型,但是对于用作类型参数的每种值类型,其运行时类型都是单独的。

在Java中,没有诸如原始类型的泛型之类的东西,而在.NET中,没有诸如值类型的显式盒装版本之类的东西。 Java具有double (原始类型)和Double (引用类型),但是C#仅具有double (值类型)。 将值类型存储为引用的唯一方法是使用类型object或特定值类型实现的接口类型。

如果可以修改interface I ,我建议您这样做:

public interface I<T>
{
    IEnumerable<T> Enumers { get; }
}

因为拳击 如果没有,您可以这样做:

public class A<T> : I
{
     IEnumerable<T> items;

     public IEnumerable<object> Enumers
     {
         get
         {
            foreach(var item in items)
            {
                yield return (object)item;
            }
         }
     }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM