2010-11-01 51 views
4

我想訪問通用函數中引入的類型的靜態字段。但是編譯器總是給我這個錯誤訪問通用函數中的類型名稱的靜態字段

「T」是一個「類型參數」,這是不 在給定上下文

有效這裏是代碼。

public class A 
    { 
    public static int Num = 1; 
    public int GetClassNum<T>() where T : A 
    { 
     //return T.Num; 
     //return default(T).Num; 
     //return what??? 
    } 
    } 

    public class B : A 
    { 
    public static int Num = 2; 
    } 

    public class C : A 
    { 
    public static int Num = 3; 
    } 

我懷疑這與接口通常用於過濾通用函數中的typename的事實有關。或者它必須永遠是?在這種情況下,不應該有靜態字段。有什麼辦法可以實現?

回答

1

試試這個:

public class A 
    { 
    private static int _num = 1; 
    public virtual int Num { get { return _num; } set { _num = value; } } 
    public int GetClassNum<T>(T input) where T : A 
    { 
     return input.Num; 
    } 
    } 

然後在派生類

+0

好的,但如何不通過輸入作爲參數? – 2010-11-01 09:48:04

+0

您需要具有該類型的實例才能獲取其屬性。 – 2010-11-01 09:49:29

1

靜態字段屬於類型,而不是類型的實例覆蓋民。您不能引用類型參數的靜態元素,因爲它們不是繼承的。

使民不靜態屬性:

public class A 
{ 
    public virtual int Num 
    { 
     get { return 1; } 
    } 

    public int GetClassNum<T>(T instance) where T : A 
    { 
     return instance.Num; 
    } 
} 

public class B : A 
{ 
    public override int Num 
    { 
     get { return 2; } 
    } 
} 

public class C : A 
{ 
    public override int Num 
    { 
     get { return 3; } 
    } 
} 
+0

但我不想傳遞一個實例。我認爲泛型函數是將類型作爲參數傳遞的方式,對吧? – 2010-11-01 09:51:43

+0

您可以將類型作爲參數傳遞,但不能訪問類型的靜態元素,因爲它們屬於該類型並且不被繼承。 – 2010-11-01 10:13:32

1

你在做什麼是錯的,你試圖訪問一個類型,而不是一個實例。

那麼如何解決這個問題,

public class A 
    { 
     public static int Num = 1; 
     public int GetClassNum<T>(T inn) where T : A 
     { 
      inn.Num //really 

     } 
    } 

等待,等待......你不能做到這一點。由於Num是靜態的,我們已經通過了(T inn)是一個對象引用(只有一個類可以訪問靜態字段,而不是對象)。那麼我們該如何做到這一點。一種方法是將T作爲靜態類型,所以

public static class A 
     { 
      public static int Num = 1; 
      public int GetClassNum<T>(T inn) where T : A // Error here 
      { 
       inn. /// no Num 

      } 
     } 

等等,你也不能這樣做。因爲你不能使用靜態實例作爲通用約束,因爲靜態是自己封閉的。

所以如何訪問Num,將Num改爲對象實例或參考Preets answer for other option。