2010-11-01 3 views
4

Je veux accéder à des champs statiques d'un type, qui est une classe, introduite dans une fonction générique. Mais compilateur me donne toujours cette erreuraccéder à un champ statique d'un nom de type dans la fonction générique

« paramètre de type » « T » est un qui est pas valable dans le contexte donné

est le code ici. Je soupçonne que cela a quelque chose à voir avec le fait que les interfaces sont généralement utilisées pour filtrer le nom de type dans une fonction générique. ou doit-il être toujours? Dans ce cas, il ne devrait pas y avoir de champ statique. Y a-t-il un moyen que je puisse atteindre?

Répondre

1

essayez ceci:

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; 
    } 
    } 

outrepasser Puis Num dans les classes dérivées

+0

ok mais que diriez-vous sans passer l'entrée en tant que paramètre? –

+0

Vous devez avoir une instance du type pour obtenir ses propriétés. –

1

champs statiques appartiennent à taper, pas par exemple du type. Vous ne pouvez pas faire référence aux éléments statiques du paramètre type car ils ne sont pas hérités.

Marque Num pas propriété statique:

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

mais je ne veux pas passer une instance. Je pensais que les fonctions génériques sont le moyen de passer le type comme paramètre, non? –

+0

Vous pouvez passer un type en tant que paramètre, mais vous ne pouvez pas accéder aux éléments statiques de type car ils appartiennent au type et ne sont pas hérités. –

1

Ce que vous faites est mal, vous essayez d'accéder à un type, pas une instance.

Alors, comment résoudre ce problème,

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

     } 
    } 

Attends, attends ... Tu ne peux pas faire cela aussi. Parce que Num est statique et que ce que nous avons passé (T inn) est une référence d'objet (Seule une classe peut accéder aux champs statiques, pas aux objets). Alors, comment pouvons-nous faire ce travail. Une façon est de faire T comme un type statique, donc

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

      } 
     } 

attendre, vous ne pouvez pas faire cela aussi. Parce que vous ne pouvez pas utiliser des instances statiques comme contrainte générique car static est lui-même scellé. Donc, comment accéder à Num, changer Num pour l'instance d'objet ou se référer à la réponse de Preets pour une autre option.

Questions connexes