Даже без обобщений вы можете иметь разные типы делегатов, которые идентичны в сигнатурах и типах возвращаемых данных. Например:
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);
}
В приведенном выше примере два неуниверсальных типа имеют одинаковую сигнатуру и тип возвращаемого значения. (И на самом деле также, как Predicate<string>
и Func<string, bool>
). Но, как я пытался указать, «значение» этих двух понятий различно.
Это похоже на то, что если я сделаю два класса, class Car { string Color; decimal Price; }
и class Person { string FullName; decimal BodyMassIndex; }
, то просто потому, что оба они содержат string
и decimal
, это не означает, что они "одинаковые" тип.