2011-06-02 63 views
4

鑑於以下類:Lambda表達式類型推斷在繼承鏈中是不同的。爲什麼?

public class Class1<TObject> { 
    protected void MethodA<TType>(Expression<Func<TObject, TType>> property, ref TType store, TType value) { 
    } 
} 

public class Class2<TObject> : Class1<Class2<TObject>>{ 
    private int _propertyInt; 
    public int PropertyInt { 
     get { return _propertyInt; } 
     set { MethodA(c2 => c2.PropertyInt, ref _propertyInt, value); } 
    } 
} 

public class Class3 : Class2<Class3> { 
    private float _propertyFloat; 
    public float PropertyFloat { 
     get { return _propertyFloat; } 
     set { MethodA(c3 => c3.PropertyFloat, ref _propertyFloat, value); } 
    } 
} 

對於等級2的C#編譯器推斷通用類型中的「PropertyInt」屬性setter lambda表達式基類的,但對於Class3的編譯器推斷的基類,不只是基類的泛型類型。爲什麼是這樣?代碼示例中推斷類型的標準是什麼。謝謝。

回答

4

首先,TObject泛型參數在Class1中定義。 TObject在Class1中用作MethodA中的類型參數。

在Class2中,傳遞給基類(Class1)的TObject是一個Class2,所以lambda可以推斷出本地屬性_propertyInt。

在Class3中,傳遞給基礎的TObject是一個Class2,而不是Class3。因此,lambda的參數被推斷,但它被推斷爲Class2,而不是Class3。

Class2 有一個名爲TObject的類型參數的事實是完全巧合的 - 我認爲您期望傳遞給該TObject的任何內容都將被傳遞到Class1,事實並非如此。

如果定義Class3的如下,它的工作:

public class Class3 : Class1<Class3> { ... } 

鑑於評論,然後我可能提供這種擴展方法基礎的解決方案,(假設類型參數只爲使這一目的工作):

public class Class1 
{ 
} 

public static class StaticClass1 
{ 
    public static void MethodA<TZen, TType>(this TZen zen, Expression<Func<TZen, TType>> property, ref TType store, TType value) where TZen : Class1 
    { 
     // Do whatever here... 
    } 
} 

public class Class2 : Class1 
{ 
    private int _propertyInt; 
    public int PropertyInt 
    { 
     get { return _propertyInt; } 
     set { this.MethodA(c2 => c2.PropertyInt, ref _propertyInt, value); } 
    } 
} 

public class Class3 : Class2 
{ 
    private float _propertyFloat; 
    public float PropertyFloat 
    { 
     get { return _propertyFloat; } 
     set { this.MethodA(c3 => c3.PropertyFloat, ref _propertyFloat, value); } 
    } 
} 
+0

嗯,你完全正確,Chris,TObject類型(在Class1中)永遠是Class2,無論鏈條多深。現在,我在世界上怎麼會想念這個?不幸的是,你的解決方案不適用於我的情況,因爲它意味着Class3將不再繼承Class2的屬性。最簡單的解決方案是將C3投射爲「Class3」。我的問題是關於我認爲推論的不一致,但正如你所指出的那樣,它並不矛盾。 – 2011-06-02 02:26:15

+0

請參閱上面的編輯,瞭解可能有所幫助的備用解決方案。 – 2011-06-02 02:41:13

相關問題