Vor Kurzem ist mir etwas Interessantes passiert das wunderbar in die Rubrik Aargh passt. Ein Bug der nach langem Suchen einen wunderbaren Erkenntnisgewinn mit sich brachte.

Zunächst muss man sagen, dass ich angestachelt von meinem neuen Job auch privat StyleCop in Verbindung mit ReSharper verwende um meinen Code sauberer zu gestalten und um nicht evtl. Konflikte bzw. Inkonsistenzen durch unterschiedliches Vorgehen zu riskieren. Die hierbei verwendeten Regeln verlangen, dass alle usings einer Datei innerhalb des entsprechenden Namespaces zu stehen haben.

namespace MyApp
{
      using Systems;
      class Class1
      {
      }
}

Nun habe ich mich zwar schon gefragt wofür dies gut sein soll, aber nachdem es mir keiner wirklich erklären konnte hatte ich dann auch vergessen einfach mal im Internet nachzusehen. Bis zu dem Zeitpunkt als ich eines meiner Sandbox-Projekte mit StyleCop auf die einheitliche Code-Guideline „umgerüstet“ habe und kurze Zeit später dem typischen „Gestern gings noch“ – Effekt erlag. Was war geschehen?

Folgende Dateien seien beispielhaft gegeben:

IFormattable.cs

namespace MyApp
{
      public interface IFormattable
      {
		string FormatString { get; set; }
      }
}

StatementManager.cs

namespace MyApp.Implementation
{
    using System.Collections.Generic;
    using System;
    public class StatementManager
    {
        public void InitStatements()
        {
            foreach (IFormattable formattable in Statements)
            {
                formattable.FormatString = "{0}";
            }
        }
        protected IEnumerable<IFormattable> Statements
        {
            get; set;
        }
    }
}

Wie gesagt, ist das Projekt ein Spielprojekt und deshalb war es auch das aller erste bei dem ich Resharper ein Code-Clean-Up mit den StyleCop Regeln habe machen lassen. Weil es ein Spielprojekt war, hatte ich auch nicht sonderlich auf die Form und Funktion geachtet. Deshalb ist mir nicht aufgefallen das ich „Formattable“ statt „Formatable“ geschrieben hatte (ein Hoch auf Intellisense).

Nach dem kompilieren des obigen Codes bemängelte der Compiler dann, dass IFormattable keine Property FormatString vorschreibt. Wie der Zufall so will, gibt es im Namespace Systems nämlich genau dieses Interface. Bisher wurde es nur halt verdeckt, da bei der Suche nach möglichen Datentypen zuerst die „lokalen“ Namensräume durchsucht werden. MyApp hatte deshalb Vorrang vor System und mein Schreibfehler somit keine Auswirkung.

Das hat man also davon wenn man seiner Neugier nicht nachgibt…


Kick It auf dotnet-kicks.de