2012-03-31 21 views
4

Ist es möglich, eine Typeinschränkung zu haben, die ein "oder" zweier Typen anstelle von "und" ist. Ein "und" wird erreicht, indem zwischen den beiden Typen ein Komma gesetzt wird. Aber was ist mit einem "oder"?Bedingte Entweder-Oder-Bedingung

class Type1<T, U> 
{ 
    public static Type1<T, U> New<V>(V v) 
     where V : T, U 
    { 
     return new Type1<T, U>(); 
    } 
} 

So in dem obigen Beispiel das Argument in New() übergeben muß sowohl ein T und ein U. sein, aber ich will es entweder ein T oder ein U.

Antwort

4

Es sein Es gibt keine Möglichkeit, die Einschränkung "oder" in der von Ihnen beschriebenen Weise auszudrücken. Sie können dies jedoch emulieren, indem Sie zwei Überladungen haben, von denen eine U und die andere T akzeptiert. Diese beiden können dann fließen in eine gemeinsame Funktion, die Griffe T oder U

class Type1<T, U> { 
    public static Type1<T, U> New(U p) { 
    return NewCore(p); 
    } 

    public static Type1<T, U> New(T p) { 
    return NewCore(p); 
    } 

    private static Type1<T, U> New(object o) { 
    ... 
    } 
} 

Nicht ganz sicher, was man allerdings mit dem T oder U Parameter tun wollen. Vielleicht könnten Sie ein wenig weiter entwickeln

+0

+1 Ich habe bereits zwei öffentliche Überlastungen von New. Mit diesem Ansatz hätte ich also vier öffentliche Überlastungen plus die private. Es ist eine Menge Überlastungen, aber trotzdem würde es funktionieren. – HappyNomad

1

Sie könnten ein leeres Marker-Interface erstellen und sowohl T als auch U "implementieren" lassen. Beschränken Sie dann new auf jeden Typ, der diese Schnittstelle implementiert.

public interface ITOrU { /*empty interface*/ } 

public interface IT : ITOrU 
{ 
} 

public interface IU : ITOrU 
{ 
} 

class Type1<T, U> 
    where T : IT 
    where U : IU 
{ 
    public static Type1<T, U> New(ITOrU v) 
    { 
     return new Type1<T, U>(); 
    } 
} 
+0

Dies ist eine hilfreiche Antwort, danke! Aber wenn Sie ein Codebeispiel hinzufügen, wäre es noch besser. – HappyNomad