還沒有解僱了反光看差異,但比較Func<T, bool>
與Predicate<T>
編譯後是不是功能<T, bool>和謂詞<T>相同的東西?
我會想象沒有區別,當一個希望看到完全一樣的編譯代碼既採取通用的參數和返回布爾?
還沒有解僱了反光看差異,但比較Func<T, bool>
與Predicate<T>
編譯後是不是功能<T, bool>和謂詞<T>相同的東西?
我會想象沒有區別,當一個希望看到完全一樣的編譯代碼既採取通用的參數和返回布爾?
他們共享相同的簽名,但他們仍然是不同的類型。
Robert S.完全正確;例如: -
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");
}
}
更靈活Func
家庭只能抵達.NET 3.5,所以它會被更早出於需要包括功能重複的類型了。
(加上名字Predicate
通信的預期使用的源代碼的讀者)
即使沒有仿製藥,你可以有在相同的簽名和返回類型不同的委託類型。例如:
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
,這並不意味着他們是「相同」的類型。
@Sean - 區別在於溝通意圖。當我使用謂詞時,我的意思是將代碼塊用作「測試」,並根據測試結果採取行動。當我使用`Func`時,我只需要一個函數,它需要一個參數並返回一個布爾值。 –
Gishu
2010-05-06 15:53:11
可能的重複[爲什麼函數而不是謂詞?](http://stackoverflow.com/questions/665494/why-funct-bool-instead-of-predicatet) –
abatishchev
2012-04-18 13:52:31