Hallo Leute,
ich habe die folgenden zwei Extension Methods:
// Klasse: CollectionExtensions
public static bool IsEmpty(this IEnumerable collection)
{
return collection == null || !collection.GetEnumerator().MoveNext();
}
// Klasse: ValueTypeExtensions
public static bool IsEmpty<T>(this T value) where T : struct
{
return value.Equals(default(T));
}
Wenn ich nun IsEmpty auf z. B. einer List<int> aufrufe, erhalte ich vom Compiler folgende Fehlermeldung:
Fehlermeldung:
The type 'System.Collections.Generic.List<int>' must be a non-nullable value type in order to use it as parameter 'T' in the generic type or method 'ValueTypeExtensions.IsEmpty<T>(T)'
Er ruft also offensichtlich die falsche Extension Method auf. Hat jemand eine Idee wie ich das Problem lösen kann ohne eine der Methoden umzubenennen?
Das: !collection.GetEnumerator().MoveNext();
hat böse Seiteneffekte. Mach danach bitte ein Reset().
Sicher, dass beide Klassen auch "erreichbar" sind? Sprich beide in einem eingebundenen NameSpace liegen?
Gruß, Christian.
Das:
!collection.GetEnumerator().MoveNext();
hat böse Seiteneffekte. Mach danach bitte ein Reset().
Danke für den Tipp!
Sicher, dass beide Klassen auch "erreichbar" sind? Sprich beide in einem eingebundenen NameSpace liegen?
Ja, sie liegen beide im selben Namespace und er ist auch eingebunden.
Hallo cartilla,
soweit ich mich erinnere, bevorzugt der Compiler generische vor nicht-generischen Extension-Methods.
Das Einfachste wird sein, die eine Methode in "IsCollectionEmpty" umzubenennen oder besser die andere in "EqualsDefault" (syntaktisch sinnvoller), wobei du auch einmal Folgendes probieren könntest:
public static bool IsEmpty<T>(this IEnumerable<T> collection)
Habe es befürchtet 🙁 Ich habe die zweite Methode jetzt in EqualsDefault umbenannt. Vielen Dank für die schnelle Hilfe!
Deine IsEmpty() Implementierung macht genau das Gegenteil der .Any() aus System.Linq... Alternativ könntest du einfach
if (!collection.Any()) aufrufen...
loop:
btst #6,$bfe001
bne.s loop
rts