Domanda

Non ho sparato riflettore a guardare la differenza, ma sarebbe uno si aspetta di vedere l'esatto stesso codice compilato quando si confrontano Func<T, bool> vs Predicate<T>

Immagino che non vi è alcuna differenza come sia prendere un parametro generico e ritorno bool?

È stato utile?

Soluzione

Essi condividono la stessa firma, ma sono ancora diversi tipi.

Altri suggerimenti

Robert S.è del tutto corretta;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");
  }
}

Il più flessibile Func la famiglia arrivò solo nel .NET 3.5, in modo funzionalmente tipi duplicati che doveva essere incluso prima necessità.

(Più il nome Predicate comunica l'utilizzo previsto per i lettori di codice sorgente)

Anche senza farmaci generici, è possibile avere diversi tipi di delegati che sono identici nelle firme e i 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 di cui sopra, le due camere non-tipi generici hanno la stessa firma e tipo di ritorno.(E in realtà anche lo stesso Predicate<string> e Func<string, bool>).Ma, come ho cercato di indicare, il "significato" dei due sono diversi.

Questo è un po ' come se io faccio due classi, class Car { string Color; decimal Price; } e class Person { string FullName; decimal BodyMassIndex; }, quindi, solo perché entrambi tenere un string e un decimal, che non significa che lo stesso tipo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top