2016-11-16 45 views
0

我被這個問題困住了幾個小時。我試圖找到一個C#的等價方法。C中有界的通配符#

的Java,工作原理:

public class Main 
{ 
    public static void main(String[] args) 
    { 
    ArrayList<BaseList<? extends Base>> list = new ArrayList<>(); 
    list.add(new DerivedList()); 
    } 
} 

public class BaseList<T extends Base> 
{ 

} 

public class Base 
{ 

} 

public class DerivedList extends BaseList<Derived> 
{ 

} 

public class Derived extends Base 
{ 

} 

我需要ArrayList<BaseList<? extends Base>>等效的方法在C#。我希望有人幫助我。

它在C#中可以通配符變量嗎?

回答

1

你不能這樣做,完全按照你的描述,但也有變通方法。一個是在另一個答案中提到,另一個是用接口代替:

public class Main 
{ 
    public static void main(String[] args) 
    { 
     var list = new List<IBaseList<Base>>(); 
     list.Add(new DerivedList()); 
    } 
} 
// note "out" here 
public interface IBaseList<out T> where T : Base { 

} 

public class BaseList<T> : IBaseList<T> where T : Base { 

} 

public class Base { 

} 

public class DerivedList : IBaseList<Derived> { 

} 

public class Derived : Base { 

} 
+0

如果我使用這種方法,我遇到的問題與Lucas Trzesniewski的評論中提到的相同 – boraida

+0

您不能在該接口中聲明「List Entries」屬性,因爲它會違反方差(即「out」關鍵字)。但是,您可以聲明它爲「IEnumeable 條目」,如果這將滿足您的需求。 – Evk

1

C#使用運行時類型實例,而Java使用類型擦除。這意味着在Java中,ArrayList<Foo>在運行時與ArrayList<Bar>的類相同。這是而不是在C#的情況下,所以你不能扔掉這樣的類型參數。

你可以嘗試解決的是這樣的:

public abstract class BaseList 
{ 
} 

public class BaseList<T> : BaseList 
    where T : Base 
{ 
} 

然後用List<BaseList>

+0

謝謝!但是你知道我怎樣才能在'List '中訪問'BaseList '中的一個屬性? – boraida

+0

@boraida如果它不依賴於'T',請將它移動到'BaseList'。你沒有提供你的類的定義,所以我不能說更多。 –

+0

它實際上取決於'T'。該屬性是'公共虛擬列表條目{get; },使它變成虛擬的,所以派生類可以覆蓋它並向其中添加'XmlElement'屬性。任何提示來實現這一目標? – boraida