簡體   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