Auch ohne Generika, können Sie verschiedene Delegattypen haben, die in Signaturen identisch sind und Typen zurück. Beispiel:
namespace N
{
// Represents a method that takes in a string and checks to see
// if this string has some predicate (i.e. meets some criteria)
// or not.
internal delegate bool StringPredicate(string stringToTest);
// Represents a method that takes in a string representing a
// yes/no or true/false value and returns the boolean value which
// corresponds to this string
internal delegate bool BooleanParser(string stringToConvert);
}
Im obigen Beispiel haben die beiden nicht generischen Typen dieselbe Signatur und denselben Rückgabetyp. (Und eigentlich auch das gleiche wie Predicate<string>
und Func<string, bool>
). Aber wie ich zu zeigen versuchte, ist die "Bedeutung" der beiden unterschiedlich.
Dies ist ein wenig wie wenn ich zwei Klassen machen, class Car { string Color; decimal Price; }
und class Person { string FullName; decimal BodyMassIndex; }
, dann nur, weil sie beide halten ein string
und ein decimal
, bedeutet das nicht, dass sie die „gleiche“ Art sind.
@Sean - der Unterschied liegt in der Kommunikation Absicht. Wenn ich ein Prädikat verwende, bezeichne ich den Codeblock als "Test" und ergreife Maßnahmen basierend auf dem Testergebnis. Wenn ich ein 'Func' benutze, muss ich nur eine Funktion mandatieren, die einen Parameter nimmt und ein bool zurückgibt. –
Gishu
mögliches Duplikat von [Why Func anstelle von Prädikat ?] (Http://stackoverflow.com/questions/665494/why-funct-bool-instead-of-predicatet) –
abatishchev