2016-06-08 76 views
1

是否有某种方式来获得在C#中一个java List<?>Java列表<?>在C#

我需要得到一个IEnumerable<T>,其中T可以是class(串),或struct(INT,双...)。

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>

任何想法?

+2

你想要这个代码做什么?完全可能有更好的C#替代方案。 – Sayse

+0

类和结构是非常不同的野兽(引用和值语义)。将它们混合在同一个集合中听起来有问题。 – TrueWill

+0

您需要为您的'var x = a.Enumers;'行​​添加显式类型转换...可以使用Linq – jleach

回答

2

你需要得到不同的IEnumerable的元素已经投像这样:

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

在C#中有一种叫做boxing我的猜测是这将如何为T是结构工作,虽然我没有”检查。从IEnumerable

2

IEnumerable<T>继承,所以这取决于你的实际需要,你有两个选择:改变你的返回类型IEnumerable

IEnumerable Enumers { get; } 

或者投下您收集的所有元素object

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

C#中没有像Java那样的通配符<?>

但随着dynamic和语言具体的东西使用,你也能处理这样的问题:见(C# Generics: wildcards

像其他网友指出可以使用Cast功能解决你的问题。

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

在.NET CLR,类型参数被取决于它是否是一个参考类型(例如object)或值类型(例如double)非常不同的处理。实质上,所有参考类型变量都是相同大小的指针,而所有值类型变量恰好是值类型的大小。

事实上,CLR会为你的类型参数使用每个值类型适用于你可以指定一个类型参数的所有引用类型单一的运行时类型,但个别运行类型。

在Java中有没有这样的事情作为仿制药的基本类型,而在.NET中有没有这样的事,作为一个价值型的明确盒装版本。 Java有double(原始类型)和Double(引用类型),但C#只有double(值类型)。将值类型存储为参考的唯一方法是使用类型object或特定值类型实现的接口类型。

0

在情况下,如果你可以修改你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; 
      } 
     } 
    } 
}