it-swarm.com.de

generische NICHT-Einschränkung, bei der T:! IEnumerable

Ist es gemäß Titel möglich, in Typ 4 negative Einschränkungen in c # 4 zu deklarieren?

44
Cel

Nein, weder in C # noch in der CLR gibt es ein solches Konzept.

40
Jon Skeet

Soweit ich weiß, ist das nicht möglich.

Was Sie tun können, ist eine Laufzeitüberprüfung:

public bool MyGenericMethod<T>()
{
    // if (T is IEnumerable) // don't do this

    if (typeof(T).GetInterface("IEnumerable") == null)
        return false;

    // ...

    return true;
}
4
Didier Ghys

Ich habe selbst versucht, den gleichen Fall zu implementieren, der in den Kommentaren erwähnt wird:

void doIt<T>(IEnumerable<T> what) { }
void doIt<T>(T whats) { }

Ich ausgenommen der folgende Code, um auf die first-Methode zu verweisen :

doIt(new List<T>());

Aber es tatsächlich verweist auf die zweite .

Eine Lösung ist, cast das Argument wie folgt:

doIt(new List<T>().AsEnumerable<T>());

Die Besetzung könnte durch eine andere Überladung verborgen werden:

void doIt<T>(List<T> whats) {
    doIt(whats.AsEnumerable<T>());
}
3
Ricardo Valente

Nein, aber es wäre möglich, mit einem "ist" zu überprüfen und es entsprechend zu behandeln ...

0
Jay

Sie verwenden eine Einschränkung, um sicherzustellen, dass der verwendete Typ über einige Eigenschaften/Methoden/... die Sie verwenden möchten verfügt.

Ein generischer Typ mit negativer Einschränkung für Typen macht keinen Sinn, da es nicht sinnvoll ist, das Fehlen einiger Eigenschaften/Methoden die Sie nicht verwenden möchten zu kennen.

0
ken2k

eine Verwendung dafür wäre ein Optionstyp.

public class Option<A,B> 
where A : !B
where B : !A
{
    private readonly A a;
    private readonly B b;

    private Option(){}

    public Option(A a) 
    {
        this.a = a
    }

    public Option(B b)  
    {
        this.b = b
    }
} 

die Laufzeitüberprüfung würde natürlich funktionieren, aber Sie würden zur Kompilierzeit nicht von der Typüberprüfung profitieren. 

0
David