267 votes

ReSharper avertit : « Champ statique dans le type générique »

<pre><code></code><p><code></code><code></code>que j’ai arriver à l’instance.</p></pre>

475voto

Jon Skeet Points 692016

C’est bien d’avoir un champ statique dans un type générique, aussi longtemps que vous savez que vous aurez vraiment un champ par combinaison d’arguments de type. Ma conjecture est que R # juste vous avertit dans le cas où vous n’étiez pas au courant de cela.

150voto

AakashM Points 32891

À partir de la JetBrains wiki:

Dans la grande majorité des cas, d'avoir un champ statique dans un type générique est un signe d'une erreur. La raison pour cela est qu'un champ statique dans un type générique va pas être partagées entre les instances des différents fermer des types construits. Cela signifie que pour une classe générique C<T>qui a un champ statique X, les valeurs de C<int>.X et C<string>.X sont complètement différents, des valeurs indépendantes.

Dans les rares cas où vous ne besoin de la 'spécialisés' des champs statiques, se sentir libre pour supprimer l'avertissement.

Si vous avez besoin d'avoir un champ statique partagée entre les instances avec différents arguments génériques, de définir un non-générique de la classe de base pour stocker vos membres statiques, puis définissez votre type générique pour hériter de ce type.

66voto

achristov Points 157

Ce n'est pas une erreur par tous les moyens. C'est une sorte de malentendu de la part des génériques en C#. Le moyen le plus facile de se rappeler ce que les médicaments génériques ne sont les suivants: Les génériques sont des "modèles" pour la création de classes, comme dans beaucoup de classes sont des "modèles" pour créer des objets. (Eh bien, c'est une simplification. Vous pouvez utiliser la méthode de génériques).

De ce point de vue, MyClassRecipe<T> n'est pas une classe -- c'est une recette, un plan, de ce que votre classe. Une fois que vous remplacez T avec quelque chose de concret, disons int, string, etc., vous obtenez une classe. Il est parfaitement légal d'avoir un membre statique (champ, une propriété, une méthode) est déclarée dans votre classe nouvellement créée (comme dans toute autre classe) et aucun signe de l'erreur ici. Il serait un peu suspect, à première vue, si vous déclarez static MyStaticProperty<T> Property { get; set; } dans votre classe, plan, mais ce qui est légal aussi. Seulement votre propriété pourrait être paramétrée, ou basé sur un modèle, aussi bien.

Pas étonnant en VB statique sont appelés shared. Dans ce cas toutefois, vous devez être conscient que ces "partagé" les membres sont partagés entre la classe de cas, et non entre les différentes classes produites par la substitution d' <T> avec quelque chose d'autre.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X