Pourquoi est-ce que je ne peux pas utiliser virtual / override sur des variables de classe comme je peux sur des méthodes?

Dans l'exemple suivant, je suis en mesure de créer un virtuel méthode Show() dans le hérité classe et puis remplacer dans le hériter classe.

Je veux faire de la même chose avec le protégé variable de classe prefix mais j'obtiens l'erreur:

Le modificateur "virtuel" n'est pas valide
pour cet article

Mais puisque je ne peux pas définir cette variable comme virtuel/remplacer dans mes classes, j'ai le compilateur avertissement:

TestOverride234355.SecondaryTransaction.préfixe'
masque membre hérité
'TestOverride234355.Des transactions.préfixe'.
Utiliser le mot clé new si cachette était
prévu.

Heureusement, lorsque j'ajoute le new mot-clé tout fonctionne très bience qui est normal puisque je obtenir la même fonctionnalité, mais cela soulève deux questions:

  1. Pourquoi je peux utiliser virtual/remplacer des méthodes, mais pas pour les protégés de variables de classe?
  2. Quelle est la différence entre le virtuel/remplacement d'approche et de la peau-il-avec-la nouvelle approche depuis au moins dans cet exemple, ils offrent la même fonctionnalité?

Code:

using System;

namespace TestOverride234355
{
    public class Program
    {
        static void Main(string[] args)
        {
            Transaction st1 = new Transaction { Name = "name1", State = "state1" };
            SecondaryTransaction st2 = 
                new SecondaryTransaction { Name = "name1", State = "state1" };

            Console.WriteLine(st1.Show());
            Console.WriteLine(st2.Show());

            Console.ReadLine();
        }
    }

    public class Transaction
    {
        public string Name { get; set; }
        public string State { get; set; }

        protected string prefix = "Primary";

        public virtual string Show()
        {
            return String.Format("{0}: {1}, {2}", prefix, Name, State);
        }
    }

    public class SecondaryTransaction : Transaction
    {
        protected new string prefix = "Secondary";

        public override string Show()
        {
            return String.Format("{0}: {1}, {2}", prefix, Name, State);
        }
    }
}

source d'informationauteur Edward Tanguay