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