2010-11-05 5 views
13

Ich möchte die möglichen Typen einschränken, die N unter Verwendung einer Einschränkung annehmen kann. Ich möchte N auf ein int oder ein dezimales beschränken.Wie schränkt man T auf Werttypen ein, die eine Einschränkung verwenden?

public static Chart PopulateInto<T, N>(List<T> yAxis, List<N> xAxis) where N : int, decimal 
{ 
    // Do stuff here 
} 

Jede Hilfe willkommen ...

+1

Wenn das die beiden einzigen Arten sind, die Sie interessieren, denke ich, dass Sie gerade die Methode überladen konnten. Sicher, es sind 4 Überladungen, aber das ist nicht so schlimm. –

Antwort

7

Warum dies nicht nur tun:

public static Chart PopulateInto<T>(List<T> yAxis, List<int> xAxis) 
{ 
    // Do stuff here 
} 

public static Chart PopulateInto<T>(List<T> yAxis, List<decimal> xAxis) 
{ 
    // Do stuff here 
} 
+1

Ich tat das ursprünglich, aber ich hoffe auf etwas kewler –

+10

imo, vermeiden 'kewl' und kleben mit lesbar/korrekt. – Marc

+0

Und meine Generika sind aus, das ist, was ich bekomme, um Antworten am Freitagabend zu schreiben, lass mich das korrigieren. –

13

Es ist nicht möglich, einen allgemeinen Parameter auf einen bestimmten Wert Typen zu beschränken.

Sie können es jedoch zwingen ein Werttyp oder struct durch where N : struct Zugabe zu sein, aber das ist alles.

+1

Eine alternative Möglichkeit, um es zu behandeln, ist, spezifische Überladungen für "Int" oder "Dezimal" -Listen zu haben. –

6

Es gibt keine Möglichkeit, dies mit einer Einschränkung zu tun. Ein anderer Ansatz, unter der Annahme, dass PopulateInto kann mit einem generischen N arbeiten, ist es, den Kern algorihtm generischen und privaten und bieten 2 öffentliche Überlastungen, die eine int bzw. decimal nehmen. Dies erzeugt einen ähnlichen Effekt.

public static Chart PopulateInto<T>(
    List<T> yAxis, 
    List<decimal> xAxis) { 

    return PopulateIntoCore(yAxis, xAxis); 
} 

public static Chart PopulateInto<T>(
    List<T> yAxis, 
    List<int> xAxis) { 

    return PopulateIntoCore(yAxis, xAxis); 
} 

private static Chart PopulateIntoCore<T, N>(
    List<T> yAxis, 
    List<N> xAxis) where N : struct { 
    ... 
} 
+0

Die ersten beiden sollten öffentlich sein, richtig? ;-) –

+1

@Mark, ja, das wäre der Kern meiner Antwort;) Fixed – JaredPar

2

Wie Pieter sagte, können Sie eine Kompilierungszeitprüfung zu diesem Zweck nicht verwenden. Sie können jedoch Folgendes zur Laufzeit tun:

if(!(typeof(N).equals(typeof(int32))) && !(typeof(N).equals(typeof(decimal)))) 
    // do something 
+1

Ja, warum nicht. Wirf eine InvalidOperationException. –

Verwandte Themen