[c#] Non è Func <T, bool> e Predicate <T> la stessa cosa dopo la compilazione?



Answers

Robert S. è completamente corretto; per esempio:-

class A {
  static void Main() {
    Func<int, bool> func = i => i > 100;
    Predicate<int> pred = i => i > 100;

    Test<int>(pred, 150);
    Test<int>(func, 150); // Error
  }

  static void Test<T>(Predicate<T> pred, T val) {
    Console.WriteLine(pred(val) ? "true" : "false");
  }
}
Question

Non abbiamo attivato il reflector per osservare la differenza, ma ci si aspetterebbe di vedere lo stesso codice compilato quando si confrontano Func<T, bool> vs. Predicate<T>

Immagino che non ci siano differenze poiché entrambi prendono un parametro generico e restituiscono il bool?




Anche senza generici, puoi avere diversi tipi di delegati identici nelle firme e nei tipi di ritorno. Per esempio:

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);
}

Nell'esempio precedente, i due tipi non generici hanno la stessa firma e tipo di restituzione. (E in realtà anche lo stesso di Predicate<string> e Func<string, bool> ). Ma come ho cercato di indicare, il "significato" dei due è diverso.

Questo è un po 'come se fossi in due classi, class Car { string Color; decimal Price; } class Car { string Color; decimal Price; } class Car { string Color; decimal Price; } e class Person { string FullName; decimal BodyMassIndex; } class Person { string FullName; decimal BodyMassIndex; } class Person { string FullName; decimal BodyMassIndex; } , quindi solo perché entrambi contengono una string e un decimal , ciò non significa che siano il tipo "stesso".




Links