2010-03-20 50 views
2
public class BaseClass{ 
    public static T Find<T>(object value){ 
    -- db.get<T>("params", value); 
    } 
} 

public class Derived: BaseClass{ 
} 

... 
void someMethod(){ 
    Derived obj = Derived.Find<Derived>(1); 
} 

在上面的代碼如何更改Derived obj = Derived.FindDerived<Derived>(1);Derived obj = Derived.Find(1);C#泛型 - 返回派生類的對象?

回答

4

如果你的方法簽名是這樣的

public static T Find<T>(T value) 

然後,你可以省略方法調用的類型。但是,從給定的簽名中,編譯器無法明確指出它的類型而無法推斷出該類型。

2

在許多情況下,編譯器可以識別類型參數,它們可以被省略,但不是在所有情況。我認爲返回值只是不支持的情況之一,因爲返回值不是方法簽名的一部分。

Here是Eric Lippert關於類似問題的博客文章。

+0

編譯器抱怨 - 嘗試顯式指定類型參數。 – stackoverflow

+0

是的,你必須明確指定參數,編譯器不能確定你的情況下的類型參數。 –

2

您可以通過更改BaseClass的一個泛型類消除它:

public class BaseClass<T> { 
    public static T Find(object value){ 
     -- db.get<T>("params", value); 
    } 
} 

public class Derived: BaseClass<Derived> { 

    void someMethod(){ 
     Derived obj = Derived.Find(1); 
    } 
} 
+0

不錯的建議。 –