Laden...

[erledigt] Compiler will falsche Überladung einer Extension Method verwenden

Erstellt von cartilla vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.135 Views
C
cartilla Themenstarter:in
12 Beiträge seit 2006
vor 13 Jahren
[erledigt] Compiler will falsche Überladung einer Extension Method verwenden

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?

795 Beiträge seit 2006
vor 13 Jahren

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.

`There are 10 types of people in the world: Those, who think they understand the binary system Those who don't even have heard about it And those who understand "Every base is base 10"`
C
cartilla Themenstarter:in
12 Beiträge seit 2006
vor 13 Jahren

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.

5.742 Beiträge seit 2007
vor 13 Jahren

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)

C
cartilla Themenstarter:in
12 Beiträge seit 2006
vor 13 Jahren

Habe es befürchtet 🙁 Ich habe die zweite Methode jetzt in EqualsDefault umbenannt. Vielen Dank für die schnelle Hilfe!

0
767 Beiträge seit 2005
vor 13 Jahren

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