2008-08-28 45 views
20

還沒有解僱了反光看差異,但比較Func<T, bool>Predicate<T>編譯後是不是功能<T, bool>和謂詞<T>相同的東西?

我會想象沒有區別,當一個希望看到完全一樣的編譯代碼既採取通用的參數和返回布爾?

+0

@Sean - 區別在於溝通意圖。當我使用謂詞時,我的意思是將代碼塊用作「測試」,並根據測試結果採取行動。當我使用`Func `時,我只需要一個函數,它需要一個參數並返回一個布爾值。 – Gishu 2010-05-06 15:53:11

+0

可能的重複[爲什麼函數而不是謂詞?](http://stackoverflow.com/questions/665494/why-funct-bool-instead-of-predicatet) – abatishchev 2012-04-18 13:52:31

回答

17

他們共享相同的簽名,但他們仍然是不同的類型。

16

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

更靈活Func家庭只能抵達.NET 3.5,所以它會被更早出於需要包括功能重複的類型了。

(加上名字Predicate通信的預期使用的源代碼的讀者)

0

即使沒有仿製藥,你可以有在相同的簽名和返回類型不同的委託類型。例如:

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; },那麼僅僅是因爲他們都持有stringdecimal,這並不意味着他們是「相同」的類型。

相關問題