2010-10-23 135 views
12

我有這樣的(簡化版本)的通用方法:偏類型推斷

public static TResult PartialInference<T, TResult>(Func<T, TResult> action, object param) 
{ 
    return action((T)param); 
} 

在上文中,param是故意object類型。這是要求的一部分。

當我填寫的類型,我可以這樣調用:

var test1 = PartialInference<string, bool>(
    p => p.EndsWith("!"), "Hello world!" 
); 

不過,我想使用類型推斷。最好我想寫這個:

var test2 = PartialInference<string>(
    p => p.EndsWith("!"), "Hello world!" 
); 

但是這不能編譯。我想出的最好的是這樣的:

var test3 = PartialInference(
    (string p) => p.EndsWith("!"), "Hello world!" 
); 

我想有這樣一個類型參數,仍然有正確類型的返回類型,因爲我的實際調用看起來像這樣的理由:

var list1 = ComponentProvider.Perform(
    (ITruckSchedule_StaffRepository p) => p.GetAllForTruckSchedule(this) 
) 

這是非常醜陋的,我很想寫的是這樣的:

var list2 = ComponentProvider.Perform<ITruckSchedule_StaffRepository>(
    p => p.GetAllForTruckSchedule(this) 
) 
+2

.NET類型推斷是全部或全部 - 絕不是部分的。 – Dario 2010-10-23 10:42:53

+0

重寫該方法的任何想法仍然會擺脫「p」參數的醜陋輸入? – 2010-10-23 10:44:11

+0

@Dario這是一個過度泛化。類型推斷是C#功能,其他.net語言可能會以不同的方式處理它。 – CodesInChaos 2011-07-23 20:36:30

回答

15

您可以T分割成一個通用的方法對泛型類型:

class Foo<TOuter> { 
    public static void Bar<TInner>(TInner arg) {...} 
} 
... 
int x = 1; 
Foo<string>.Bar(x); 

這裏int是推斷出來,但字符串是明確的。

+0

謝謝,就是這樣。 – 2010-10-23 11:46:16

3

什麼你正在努力實現是不可能的。如果推論是可能的,你需要指定泛型參數或者它們中的任何一個。

+0

重寫該方法的任何想法仍然會擺脫「p」參數的醜陋輸入? – 2010-10-23 10:45:48

+0

我認爲你有的最後一個版本不是很糟糕:你只需要一個額外的返回類型的泛型參數。 – 2010-10-23 10:48:44

+0

這就是整個觀點。類型在那裏,'GetAllForTruckSchedule'有一個返回類型,我不想指定它。該方法用於例如在Linq的查詢中,我想推理儘可能地工作。 'var'一路:)。 – 2010-10-23 10:52:15