[英]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.