Frage

Beispiel:

myObject.Stub(s => s.MyMethod(null)).IgnoreArguments().Return("bleh");

var s = "s";

Eine Variable „s“ in einer Lambda definiert ist, und eine andere Variable „s“ als lokale Variable innerhalb der gleichen Methode. Visual Studio sagt mir, „Eine widersprüchliche Variable wird definiert unter“, wenn ich schweben über den ersten „s“. Warum sind diese widersprüchlichen; die „s“ in dem Lambda ist sicherlich nicht verfügbar außerhalb der umschließenden Klammern?

War es hilfreich?

Lösung

Sie sind in Konflikt, weil in der Regel von C # ist, dass zwei Verwendungen des gleichen einfachen Namen können nicht innerhalb des Block unmittelbar umschließenden einen von ihnen auf zwei verschiedene Dinge beziehen verwendet werden. In Ihrem Beispiel ist der einfache Name „s“ verwendet, um zwei Dinge im Inneren des Blocks bedeuten die lokale Variable Erklärung einschließt: Es bedeutet, eine lokale Variable und eine Lambda-Parameter. Das ist, was illegal ist. Ich stelle fest, dass die Fehlermeldung erhalten Sie sagt Ihnen diese:

A local variable named 's' cannot be declared in this scope because it
would give a different meaning to 's', which is already used in a 
'child' scope to denote something else

C # ermöglicht es Ihnen nicht die gleichen einfachen Namen mittlere zwei Dinge im gleichen Block zu haben, da dies Code fehleranfällig macht, schwer zu bearbeiten, zu schwer zu lesen, schwer zu Refactoring, und schwer zu debuggen. Es ist besser, diese schlechte Programmierung der Praxis nicht zulassen, als es zu ermöglichen und das Risiko Sie Fehler verursachen, weil Sie, dass „s“ bedeutet dasselbe im ganzen Block angenommen.

Wenn der Code nur zwei Zeilen lang ist es leicht ist, sich daran zu erinnern, dass es zwei verschiedene Bedeutungen für s, aber wenn es Hunderte von Zeilen lang ist, nicht so einfach.

Weitere Informationen zu dieser Regel finden Sie unter:

http://blogs.msdn.com/b/ericlippert/archive/2009/11/02/simple-names-are-not-so-simple.aspx

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top