2016-06-08 75 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; 
      } 
     } 
    } 
}