2016-11-16 2 views
0

Ich bin mit diesem Problem für mehrere Stunden fest. Ich versuche eine gleichwertige Methode für C# zu finden.Java begrenzte Wildcards in C#

Java arbeitet:

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 
{ 

} 

Ich brauche eine entsprechende Methode für ArrayList<BaseList<? extends Base>> in C#. Ich hoffe, dass mir jemand hilft.

Und ist es möglich in C# zu Wildcard Ihre Variablen?

Antwort

1

List<BaseList> verwenden können, dass genau das nicht tun, wie Sie beschreiben, aber es Abhilfen sind. Einer wird in einer anderen Antwort erwähnt, ein anderer ist die Verwendung der Schnittstelle:

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

Wenn ich diese Methode verwende, habe ich das gleiche Problem wie in den Kommentaren von Lucas Trzesniewski – boraida

+0

erwähnt Sie können nicht "List Entries" -Eigenschaft in dieser Schnittstelle, da es Varianz (das "out" Schlüsselwort) verletzen wird. Sie können es jedoch als "IEnumeable Entries" deklarieren, wenn dies Ihren Anforderungen entspricht. – Evk

1

C# verwendet Laufzeittypisierung, während Java Typlöschung verwendet. Das bedeutet, dass in Java ArrayList<Foo> zur Laufzeit dieselbe Klasse wie ArrayList<Bar> ist. Dies ist nicht der Fall in C#, so dass Sie nicht einfach den Typ Parameter wie wegwerfen können.

können Sie versuchen, um das so zu arbeiten:

public abstract class BaseList 
{ 
} 

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

Dann ein Sie

+0

Vielen Dank! Aber wissen Sie, wie kann ich auf eine Eigenschaft in 'BaseList ' ein Element in der 'List ' 'zugreifen? – boraida

+0

@boraida Wenn es nicht auf 'T' ankommt, verschiebe es stattdessen auf' BaseList'. Sie haben die Definition Ihrer Klassen nicht angegeben, daher kann ich nicht viel mehr sagen. –

+0

Es hängt tatsächlich von 'T' ab. Die Eigenschaft ist 'public virtual List Einträge {get; } ', hat es virtuell gemacht, damit die abgeleitete Klasse es überschreiben und dem Attribut 'XmlElement' hinzufügen kann. Irgendwelche Tipps, um dies zu erreichen? – boraida