Laden...

Warum kann der Typparameter einer generischen Funktion hier nicht weggelassen werden?

Letzter Beitrag vor 15 Jahren 5 Posts 1.010 Views
Warum kann der Typparameter einer generischen Funktion hier nicht weggelassen werden?
public void ValidateFieldIsInRange<T>(T? value, T minValue, T maxValue) where T : struct, IComparable<T>
{

          if(minValue.CompareTo(value.Value)>0 || maxValue.CompareTo(value.Value)<0)
                  //do something

}

Folgender Aufruf der Methode funktioniert nicht:

ValidateFieldIsInRange(5, minValue, maxValue);

Folgender Aufruf der Methode funktioniert:

ValidateFieldIsInRange<int>(5, minValue, maxValue);

Was ich nicht verstehe ist,warum explizit <int> angeben werden muss!

Kann mir jemand auf die Sprünge helfen?

Danke schön
rizi

Hallo rizi,

welchen Typ haben denn minValue bzw. maxValue?

Evtl. liegt's auch an dem Nullable - probiere es mal nur mit "T value".

@winSharp93
minValue und maxValue sind ebenfalls int-werte:
zb:

ValidateFieldIsInRange(5, 1, 9);

ohne Nullable funktioniert es, allerdings wird Nullable hier benötigt, ist allerdings anhand des obrigen Beispiels nicht zu erkennen!

Meine Frage ist eben warum dieses Nullable diesen Einfluss hat.

bzw. wenn man null für value verwendet kann man sich das <int> ebenfalls sparen:
Bsp.:

ValidateFieldIsInRange(null, 1, 9);

Bin für weitere Tipps dankbar.

lg
rizi

Hallo rizi,

den Typparameter kannst du nur dann weglassen, wenn der Typparameter zweifelsfrei aus den Typen der aktuellen Parameter bestimmt werden kann. Zweifelsfrei kann er nur dann bestimmt werden, wenn keine impliziten Konvertierungen durchgeführt werden müssen. 5 muss aber implizit in Nullable<int> konvertiert werden, damit die Methode aufgerufen werden kann. Also kann der Typ nicht zweifelsfrei ermittelt werden, also musst du ihn explizit angeben.

Ich kann allerdings nicht erkennen, inwiefern die Frage allgemein sein sollte. Es geht im Gegenteil um einen speziellen Aspekt. Den Titel habe ich geändert.

herbivore

Danke für die Info & danke fürs Umbenennen des Themas.

Lg
rizi