InvalidOperationException Klasse
TOC
Inhaltsverzeichnis reduzieren
Inhaltsverzeichnis erweitern
Dieser Artikel wurde maschinell übersetzt. Wenn Sie die englische Version des Artikels anzeigen möchten, aktivieren Sie das Kontrollkästchen Englisch. Sie können den englischen Text auch in einem Popupfenster anzeigen, indem Sie den Mauszeiger über den Text bewegen.
Übersetzung
Englisch

InvalidOperationException-Klasse

 

Die Ausnahme, die ausgelöst wird, wenn der Aufruf einer Methode aufgrund des aktuellen Zustands des Objekts ungültig ist.

Namespace:   System
Assembly:  mscorlib (in mscorlib.dll)


[SerializableAttribute]
[ComVisibleAttribute(true)]
public class InvalidOperationException : SystemException

NameBeschreibung
System_CAPS_pubmethodInvalidOperationException()

Initialisiert eine neue Instanz der InvalidOperationException-Klasse.

System_CAPS_protmethodInvalidOperationException(SerializationInfo, StreamingContext)

Initialisiert eine neue Instanz der InvalidOperationException-Klasse mit serialisierten Daten.

System_CAPS_pubmethodInvalidOperationException(String)

Initialisiert eine neue Instanz der InvalidOperationException-Klasse mit einer angegebenen Fehlermeldung.

System_CAPS_pubmethodInvalidOperationException(String, Exception)

Initialisiert eine neue Instanz der InvalidOperationException-Klasse mit einer angegebenen Fehlermeldung und einem Verweis auf die innere Ausnahme, die diese Ausnahme ausgelöst hat.

NameBeschreibung
System_CAPS_pubpropertyData

Ruft eine Auflistung von Schlüssel-Wert-Paaren ab, die zusätzliche benutzerdefinierte Informationen über die Ausnahme bereitstellen.(Geerbt von Exception.)

System_CAPS_pubpropertyHelpLink

Ruft einen Link zur Hilfedatei ab, die dieser Ausnahme zugeordnet ist, oder legt einen Link fest.(Geerbt von Exception.)

System_CAPS_pubpropertyHResult

Ruft HRESULT ab oder legt HRESULT fest. Dies ist ein codierter Wert, der einer bestimmten Ausnahme zugeordnet ist.(Geerbt von Exception.)

System_CAPS_pubpropertyInnerException

Ruft die Exception-Instanz ab, die die aktuelle Ausnahme verursacht hat.(Geerbt von Exception.)

System_CAPS_pubpropertyMessage

Ruft eine Meldung ab, die die aktuelle Ausnahme beschreibt.(Geerbt von Exception.)

System_CAPS_pubpropertySource

Gibt den Namen der Anwendung oder des Objekts zurück, die bzw. das den Fehler verursacht hat, oder legt diesen fest.(Geerbt von Exception.)

System_CAPS_pubpropertyStackTrace

Ruft eine Zeichenfolgendarstellung der unmittelbaren Frames in der Aufrufliste ab.(Geerbt von Exception.)

System_CAPS_pubpropertyTargetSite

Ruft die Methode ab, die die aktuelle Ausnahme auslöst.(Geerbt von Exception.)

NameBeschreibung
System_CAPS_pubmethodEquals(Object)

Bestimmt, ob das angegebene Objekt mit dem aktuellen Objekt identisch ist.(Geerbt von Object.)

System_CAPS_protmethodFinalize()

Gibt einem Objekt Gelegenheit, Ressourcen freizugeben und andere Bereinigungen durchzuführen, bevor es von der Garbage Collection freigegeben wird. (Geerbt von Object.)

System_CAPS_pubmethodGetBaseException()

Gibt beim Überschreiben in einer abgeleiteten Klasse eine Exception zurück, die die ursprüngliche Ursache für eine oder mehrere nachfolgende Ausnahmen ist.(Geerbt von Exception.)

System_CAPS_pubmethodGetHashCode()

Fungiert als die Standardhashfunktion.(Geerbt von Object.)

System_CAPS_pubmethodGetObjectData(SerializationInfo, StreamingContext)

Legt beim Überschreiben in einer abgeleiteten Klasse die SerializationInfo mit Informationen über die Ausnahme fest.(Geerbt von Exception.)

System_CAPS_pubmethodGetType()

Ruft den Laufzeittyp der aktuellen Instanz ab.(Geerbt von Exception.)

System_CAPS_protmethodMemberwiseClone()

Erstellt eine flache Kopie des aktuellen Object.(Geerbt von Object.)

System_CAPS_pubmethodToString()

Erstellt eine Zeichenfolgendarstellung der aktuellen Ausnahme und gibt diese zurück.(Geerbt von Exception.)

NameBeschreibung
System_CAPS_proteventSerializeObjectState

Tritt auf, wenn eine Ausnahme serialisiert wird, um ein Ausnahmezustandsobjekt zu erstellen, das serialisierte Daten für die Ausnahme enthält.(Geerbt von Exception.)

InvalidOperationException wird in Fällen verwendet werden, wenn ein Methodenaufruf nicht durch ungültige Argumente fehlschlägt. Es wird in der Regel ausgelöst, wenn der Zustand eines Objekts den Methodenaufruf unterstützen kann. Angenommen, ein InvalidOperationException Ausnahme wird von Methoden wie z. B.:

  • IEnumerator.MoveNext Wenn Objekte einer Auflistung nach dem Erstellen des Enumerators geändert werden. Weitere Informationen finden Sie unter Ändern einer Auflistung beim Durchlaufen Sie.

  • ResourceSet.GetString Wenn der Ressourcensatz, bevor geschlossen wird ist der Methodenaufruf erfolgt.

  • XContainer.Add, wenn das Objekt oder die Objekte hinzugefügt werden falsch strukturiertes XML-Dokument ergeben würde.

  • Eine Methode, die versucht, die Benutzeroberfläche von einem Thread, der nicht im Hauptfenster oder UI-Thread zu bearbeiten.

System_CAPS_importantWichtig

Da die InvalidOperationException Ausnahme kann ausgelöst werden in einer Vielzahl von Situationen, ist es wichtig, die zurückgegebene Ausnahme-Nachricht lesen die Message Eigenschaft.

In diesem Abschnitt

Einige häufige Ursachen für Ausnahmen InvalidOperationException
      Aktualisieren der UI-Thread von einem nicht-UI-thread
      Ändern einer Auflistung beim Durchlaufen Sie
      Ein Typ Nullable < T > umwandeln, der in den zugrunde liegenden Typ null ist 
      Eine System.Linq.Enumerable-Methode auf eine leere Auflistung aufgerufen
      Aufrufen von Enumerable.Single oder Enumerable.SingleOrDefault für eine Sequenz ohne ein element
      Feldzugriff dynamische über Anwendungsdomänen hinweg
Auslösen einer InvalidOperationException-Ausnahme
Verschiedene Informationen

Die folgenden Abschnitte zeigen, wie einige häufige, in Fällen InvalidOperationException Ausnahme in einer Anwendung. Wie Sie das Problem behandeln, hängt von der besonderen Situation ab. In den meisten Fällen führt jedoch zu die Ausnahme vom Entwickler Fehler, und die InvalidOperationException Ausnahme erwartet und vermieden werden kann.

Arbeitsthreads werden häufig verwendet, einige Hintergrundaufgaben ausführen, die umfasst das Sammeln von Daten in der Benutzeroberfläche einer Anwendung angezeigt werden. Jedoch. Die meisten GUI (graphical User Interface)-Anwendungsframeworks für .NET Framework, z. B. Windows Forms und Windows Presentation Foundation (WPF), können Sie Zugriff auf GUI-Objekte nur aus dem Thread, die erstellt und verwaltet die Benutzeroberfläche (der Haupt- oder UI-Thread). Eine InvalidOperationException wird ausgelöst, wenn Sie versuchen, ein Element der Benutzeroberfläche von einem anderen Thread als dem UI-Thread zugreifen. Der Text der Nachricht Ausnahme wird in der folgenden Tabelle angezeigt.

Anwendungstyp

Message

WPF-Anwendung

Der aufrufende Thread kann nicht auf dieses Objekt zugreifen, da ein anderer Thread es besitzt.

UWP-app

Die Anwendung, die eine Schnittstelle wurde für einen anderen Thread aufgerufen.

Windows Forms-Anwendung

Threadübergreifender Vorgang ungültig: Steuerelement "TextBox1" von einem anderen Thread als dem erstellten Thread aufgerufen.

Implementieren von Benutzeroberflächen-Frameworks für .NET Framework eine Dispatcher Muster, das eine Methode umfasst zu überprüfen, ob ein Aufruf an ein Mitglied eines Benutzeroberflächenelements auf dem UI-Thread ausgeführt wird, und andere Methoden, um den Anruf auf dem UI-Thread zu planen:

  • Rufen Sie in der WPF-apps, die Dispatcher.CheckAccess Methode, um zu bestimmen, ob eine Methode in einem nicht-UI-Thread ausgeführt wird. Es gibt true wenn die Methode auf dem UI-Thread ausgeführt wird und false andernfalls. Rufen Sie eine Überladung von der Dispatcher.Invoke Methode, um den Anruf auf dem UI-Thread zu planen.

  • Rufen Sie im UWP-apps, die CoreDispatcher.HasThreadAccess Methode, um zu bestimmen, ob eine Methode in einem nicht-UI-Thread ausgeführt wird. Rufen Sie die CoreDispatcher.RunAsync Methode, die einen Delegaten, der den UI-Thread aktualisiert. Verwenden Sie

  • In Windows Forms-apps verwenden die Control.InvokeRequired Eigenschaft, um zu bestimmen, ob eine Methode in einem nicht-UI-Thread ausgeführt wird. Rufen Sie eine Überladung von der Control.Invoke Methode, die einen Delegaten, der den UI-Thread aktualisiert.

Die folgenden Beispiele veranschaulichen die InvalidOperationException Ausnahme, die ausgelöst wird, wenn Sie versuchen, ein Element der Benutzeroberfläche von einem anderen Thread als dem Thread, der erstellt wurde. Jedes Beispiel ist es erforderlich, dass zwei Steuerelemente zu erstellen:

  • Ein Textfeld-Steuerelement mit dem Namen textBox1. In einer Windows Forms-Anwendung sollten Sie festlegen seiner Multiline -Eigenschaft true.

  • Ein Button-Steuerelement mit dem Namen threadExampleBtn. Das Beispiel enthält einen Handler ThreadsExampleBtn_Click, für der Schaltfläche Click Ereignis.

In jedem Fall die threadExampleBtn_Click Ereignishandler ruft die DoSomeWork -Methode. Der erste Aufruf synchron ausgeführt und erfolgreich abgeschlossen wird. Aber zweite Aufruf, da sie asynchron auf einem Threadpoolthread ausgeführt wird, versucht, die Benutzeroberfläche von einem nicht-UI-Thread zu aktualisieren. Dies führt zu einem InvalidOperationException Ausnahme.

WPF und UWP-apps
private async void threadExampleBtn_Click(object sender, RoutedEventArgs e)
{
    textBox1.Text = String.Empty;

    textBox1.Text = "Simulating work on UI thread.\n";
    DoSomeWork(20);
    textBox1.Text += "Work completed...\n";

    textBox1.Text += "Simulating work on non-UI thread.\n";
    await Task.Run( () => DoSomeWork(1000));
    textBox1.Text += "Work completed...\n";
}

private async void DoSomeWork(int milliseconds)
{
    // Simulate work.
    await Task.Delay(milliseconds);

    // Report completion.
    var msg = String.Format("Some work completed in {0} ms.\n", milliseconds);
    textBox1.Text += msg;
}

Die folgende Version der DoSomeWork Methode keine Ausnahme in einer WPF-Anwendung.

private async void DoSomeWork(int milliseconds)
{
    // Simulate work.
    await Task.Delay(milliseconds);

    // Report completion.
    bool uiAccess = textBox1.Dispatcher.CheckAccess();
    String msg = String.Format("Some work completed in {0} ms. on {1}UI thread\n",
                               milliseconds, uiAccess ? String.Empty : "non-");
    if (uiAccess)
        textBox1.Text += msg;
    else
        textBox1.Dispatcher.Invoke(() => { textBox1.Text += msg; });
}

Die folgende Version der DoSomeWork Methode keine Ausnahme in einer UWP-app.

private async void DoSomeWork(int milliseconds)
{
    // Simulate work.
    await Task.Delay(milliseconds);

    // Report completion.
    bool uiAccess = textBox1.Dispatcher.HasThreadAccess;
    String msg = String.Format("Some work completed in {0} ms. on {1}UI thread\n",
                               milliseconds, uiAccess ? String.Empty : "non-");
    if (uiAccess)
        textBox1.Text += msg;
    else
        await textBox1.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { textBox1.Text += msg; });
}
Windows Forms-Anwendungen
List<String> lines = new List<String>();

private async void threadExampleBtn_Click(object sender, EventArgs e)
{
    textBox1.Text = String.Empty;
    lines.Clear();

    lines.Add("Simulating work on UI thread.");
    textBox1.Lines = lines.ToArray();
    DoSomeWork(20);

    lines.Add("Simulating work on non-UI thread.");
    textBox1.Lines = lines.ToArray();
    await Task.Run(() => DoSomeWork(1000));

    lines.Add("ThreadsExampleBtn_Click completes. ");
    textBox1.Lines = lines.ToArray();
}

private async void DoSomeWork(int milliseconds)
{
    // simulate work
    await Task.Delay(milliseconds);

    // report completion
    lines.Add(String.Format("Some work completed in {0} ms on UI thread.", milliseconds));
    textBox1.Lines = lines.ToArray();
}

Die folgende Version der DoSomeWork Methode keine Ausnahme in einer Windows Forms-Anwendung.

private async void DoSomeWork(int milliseconds)
{
    // simulate work
    await Task.Delay(milliseconds);

    // Report completion.
    bool uiMarshal = textBox1.InvokeRequired;
    String msg = String.Format("Some work completed in {0} ms. on {1}UI thread\n",
                               milliseconds, uiMarshal ? String.Empty : "non-");
    lines.Add(msg);

    if (uiMarshal) {
        textBox1.Invoke(new Action(() => { textBox1.Lines = lines.ToArray(); }));
    }
    else {
        textBox1.Lines = lines.ToArray();
    }
}

Die foreach -Anweisung in c# oder For Each -Anweisung in Visual Basic wird verwendet, um die Elemente einer Auflistung durchlaufen und zu lesen oder ändern die einzelnen Elemente. Jedoch kann nicht verwendet werden, hinzufügen oder Entfernen von Elementen aus der Auflistung. Dies löst dies eine InvalidOperationException Ausnahme mit der Meldung, die ähnlich "Auflistung wurde geändert; Enumerationsvorgang kann nicht ausgeführt."

Das folgende Beispiel durchläuft eine Auflistung von ganzen Zahlen versucht das Quadrat der jede ganze Zahl in der Auflistung hinzu. Im Beispiel wird ein InvalidOperationException mit dem ersten Aufruf der List<T>.Add Methode.

using System;
using System.Collections.Generic;

public class Example
{
   public static void Main()
   {
      var numbers = new List<int>() { 1, 2, 3, 4, 5 };
      foreach (var number in numbers) {
         int square = (int) Math.Pow(number, 2);
         Console.WriteLine("{0}^{1}", number, square);
         Console.WriteLine("Adding {0} to the collection...\n", square);
         numbers.Add(square);
      }
   }
}
// The example displays the following output:
//    1^1
//    Adding 1 to the collection...
//    
//    
//    Unhandled Exception: System.InvalidOperationException: Collection was modified; 
//       enumeration operation may not execute.
//       at System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource)
//       at System.Collections.Generic.List`1.Enumerator.MoveNextRare()
//       at Example.Main()

Sie können die Ausnahme in einer von zwei Methoden, abhängig von Ihrer Anwendungslogik vermeiden:

  • Wenn die Auflistung beim Durchlaufen sie Elemente hinzugefügt werden müssen, können Sie es durchlaufen, Index mithilfe der for -Anweisung statt foreach oder For Each. Im folgenden Beispiel wird die Anweisung das Quadrat der Zahlen in der Auflistung in der Auflistung hinzufügen.

    using System;
    using System.Collections.Generic;
    
    public class Example
    {
       public static void Main()
       {
          var numbers = new List<int>() { 1, 2, 3, 4, 5 };
    
          int upperBound = numbers.Count - 1;
          for (int ctr = 0; ctr <= upperBound; ctr++) {
             int square = (int) Math.Pow(numbers[ctr], 2);
             Console.WriteLine("{0}^{1}", numbers[ctr], square);
             Console.WriteLine("Adding {0} to the collection...\n", square);
             numbers.Add(square);
          }
    
          Console.WriteLine("Elements now in the collection: ");
          foreach (var number in numbers)
             Console.Write("{0}    ", number);
       }
    }
    // The example displays the following output:
    //    1^1
    //    Adding 1 to the collection...
    //    
    //    2^4
    //    Adding 4 to the collection...
    //    
    //    3^9
    //    Adding 9 to the collection...
    //    
    //    4^16
    //    Adding 16 to the collection...
    //    
    //    5^25
    //    Adding 25 to the collection...
    //    
    //    Elements now in the collection:
    //    1    2    3    4    5    1    4    9    16    25
    

    Beachten Sie, dass Sie die Anzahl der Iterationen einrichten müssen, bevor Sie die Auflistung durchlaufen, entweder über einen Leistungsindikator in der Schleife, die die Appropraitely Schleife beendet wird, indem rückwärts durchlaufen von Count - 1, 0 oder, wie im Beispiel wird die Anzahl der Elemente im Array einer Variablen zuweisen und verwenden, um die Obergrenze der Schleife einrichten,. Andernfalls, wenn die Auflistung bei jeder Iteration ein Element hinzugefügt wird, führt eine Endlosschleife.

  • Ist es nicht notwendig, die Auflistung beim Durchlaufen sie Elemente hinzufügen, können Sie die Elemente in eine temporäre Sammlung hinzugefügt werden, dass Sie hinzufügen, wenn die Auflistung durchlaufen wurde speichern. Im folgenden Beispiel wird dieser Ansatz das Quadrat der Zahlen in einer Auflistung in eine temporäre Sammlung, hinzufügen und dann die Sammlungen in ein einzelnes Array-Objekt zu kombinieren.

    using System;
    using System.Collections.Generic;
    
    public class Example
    {
       public static void Main()
       {
          var numbers = new List<int>() { 1, 2, 3, 4, 5 };
          var temp = new List<int>();
    
          // Square each number and store it in a temporary collection.
          foreach (var number in numbers) {
             int square = (int) Math.Pow(number, 2);
             temp.Add(square);
          }
    
          // Combine the numbers into a single array.
          int[] combined = new int[numbers.Count + temp.Count];
          Array.Copy(numbers.ToArray(), 0, combined, 0, numbers.Count);
          Array.Copy(temp.ToArray(), 0, combined, numbers.Count, temp.Count);
    
          // Iterate the array.
          foreach (var value in combined)
             Console.Write("{0}    ", value);
       }
    }
    // The example displays the following output:
    //       1    2    3    4    5    1    4    9    16    25
    

Versuch umgewandelt ein Nullable<T> Wert, der null auslöst, zur zugrunde liegenden Typ ein InvalidOperationException Ausnahme und zeigt die Fehlermeldung "auf NULL festlegbares Objekt muss einen Wert aufweisen.

Im folgenden Beispiel wird eine InvalidOperationException -Ausnahme aus, wenn versucht wird, ein Array durchlaufen, umfasst einen Nullable(Of Integer) Wert.

using System;
using System.Linq;

public class Example
{
   public static void Main()
   {
      var queryResult = new int?[] { 1, 2, null, 4 };
      var map = queryResult.Select(nullableInt => (int)nullableInt);

      // Display list.
      foreach (var num in map)
         Console.Write("{0} ", num);
      Console.WriteLine();   
   }
}
// The example displays the following output:
//    1 2
//    Unhandled Exception: System.InvalidOperationException: Nullable object must have a value.
//       at System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource)
//       at Example.<Main>b__0(Nullable`1 nullableInt)
//       at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext()
//       at Example.Main()

Um die Ausnahme zu verhindern:

Im folgenden Beispiel wird sowohl zur Vermeidung der InvalidOperationException Ausnahme.

using System;
using System.Linq;

public class Example
{
   public static void Main()
   {
      var queryResult = new int?[] { 1, 2, null, 4 };
      var numbers = queryResult.Select(nullableInt => (int)nullableInt.GetValueOrDefault());

      // Display list using Nullable<int>.HasValue.
      foreach (var number in numbers)
         Console.Write("{0} ", number);
      Console.WriteLine();   

      numbers = queryResult.Select(nullableInt => (int) (nullableInt.HasValue ? nullableInt : -1));
      // Display list using Nullable<int>.GetValueOrDefault.
      foreach (var number in numbers)
         Console.Write("{0} ", number);
      Console.WriteLine();   
   }
}
// The example displays the following output:
//       1 2 0 4
//       1 2 -1 4

Die Enumerable.Aggregate<TSource>, Enumerable.Average, Enumerable.First<TSource>, Enumerable.Last<TSource>, Enumerable.Max, Enumerable.Min, Enumerable.Single<TSource>, und Enumerable.SingleOrDefault<TSource> Methoden führen Operationen für eine Sequenz, und geben ein Einzelergebnis zurück. Einige Überladungen dieser Methoden lösen eine InvalidOperationException -Ausnahme aus, wenn die Sequenz leer ist, während andere Überladungen zurückgeben null. Die Enumerable.SingleOrDefault<TSource> Methode löst außerdem eine InvalidOperationException -Ausnahme aus, wenn die Sequenz mehr als ein Element enthält.

System_CAPS_noteHinweis

Die meisten Methoden, die Auslösen einer InvalidOperationException Ausnahme sind Überladungen. Achten Sie darauf, dass Sie das Verhalten der Überladung verstehen, die Sie auswählen.

Die folgende Tabelle listet die Fehlermeldungen aus dem InvalidOperationException Exception-Objekte, die Aufrufe zu einigen ausgelöste System.Linq.Enumerable Methoden.

Methode

Message

Aggregate
Average
 Last
 Max
Min 

Sequenz enthält keine Elemente

First

Sequenz enthält kein übereinstimmendes element

Single
SingleOrDefault

Sequenz enthält mehrere übereinstimmende Elemente

Wie beseitigen oder die Ausnahme behandeln hängt von Ihrer Anwendung Annahmen und die jeweilige Methode, die Sie aufrufen.

Die Beispiele enthalten weitere Details.

Im folgenden Beispiel wird die Enumerable.Average Methode, um den Durchschnitt einer Sequenz zu berechnen, deren Werte größer als 4 sind. Da keine Werte aus dem ursprünglichen Array nicht, 4 überschreiten, keine Werte in der Sequenz enthalten sind, und die Methode löst eine InvalidOperationException Ausnahme.

using System;
using System.Linq;

public class Example
{
   public static void Main()
   {
      int[] data = { 1, 2, 3, 4 };
      var average = data.Where(num => num > 4).Average();
      Console.Write("The average of numbers greater than 4 is {0}",
                    average);
   }
}
// The example displays the following output:
//    Unhandled Exception: System.InvalidOperationException: Sequence contains no elements
//       at System.Linq.Enumerable.Average(IEnumerable`1 source)
//       at Example.Main()

Die Ausnahme behoben werden kann, durch Aufrufen der Any<TSource> Methode, um zu bestimmen, ob die Sequenz Elemente enthält, bevor die Sequenz, wie das folgende Beispiel zeigt die Methode aufrufen, die verarbeitet werden.

using System;
using System.Linq;

public class Example
{
   public static void Main()
   {
       int[] dbQueryResults = { 1, 2, 3, 4 };
       var moreThan4 = dbQueryResults.Where(num => num > 4);

       if(moreThan4.Any())
           Console.WriteLine("Average value of numbers greater than 4: {0}:", 
                             moreThan4.Average());
       else
           // handle empty collection 
           Console.WriteLine("The dataset has no values greater than 4.");
   }
}
// The example displays the following output:
//       The dataset has no values greater than 4.

Die Enumerable.First<TSource> -Methode gibt das erste Element in einer Sequenz oder das erste Element in einer Sequenz, die eine angegebene Bedingung erfüllt. Wenn die Sequenz leer ist und daher kein erstes Element, löst eine InvalidOperationException Ausnahme.

Im folgenden Beispiel die Enumerable.First<TSource>(IEnumerable<TSource>, Func<TSource, Boolean>) -Methode löst eine InvalidOperationException Ausnahme da DbQueryResults Arrays ein Element größer als 4 enthält.

using System;
using System.Linq;

public class Example
{
   public static void Main()
   {
      int[] dbQueryResults = { 1, 2, 3, 4 };

      var firstNum = dbQueryResults.First(n => n > 4);

      Console.WriteLine("The first value greater than 4 is {0}", 
                        firstNum);
   }
}
// The example displays the following output:
//    Unhandled Exception: System.InvalidOperationException: 
//       Sequence contains no matching element
//       at System.Linq.Enumerable.First[TSource](IEnumerable`1 source, Func`2 predicate)
//       at Example.Main()

Rufen Sie die Enumerable.FirstOrDefault<TSource> Methode statt Enumerable.First<TSource> zum Zurückgeben eines angegebenen Werts oder Standardwerts. Wenn die Methode ein erstes Element in der Sequenz nicht gefunden wird, wird der Standardwert für diesen Datentyp. Der Standardwert ist null für einen Verweistyp Null für einen numerischen Datentyp, und DateTime.MinValue für die DateTime Typ.

System_CAPS_noteHinweis

Interpretieren des von zurückgegebenen Werts die Enumerable.FirstOrDefault<TSource> Methode wird häufig durch die Tatsache, dass der Standardwert des Typs einen gültigen Wert in der Sequenz sein kann kompliziert. In diesem Fall wird Sie einen Aufruf der Enumerable.Any<TSource>Methode, um zu bestimmen, ob die Sequenz gültige Member vor dem Aufruf verfügt der Enumerable.First<TSource> Methode.

Im folgenden Beispiel wird die Enumerable.FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource, Boolean>) Methode, um zu verhindern, dass die InvalidOperationException im vorherigen Beispiel ausgelöste Ausnahme.

using System;
using System.Linq;

public class Example
{
   public static void Main()
   {
      int[] dbQueryResults = { 1, 2, 3, 4 };

      var firstNum = dbQueryResults.FirstOrDefault(n => n > 4);

      if (firstNum == 0)
         Console.WriteLine("No value is greater than 4.");
      else   
         Console.WriteLine("The first value greater than 4 is {0}", 
                           firstNum);
   }
}
// The example displays the following output:
//       No value is greater than 4.

Die Enumerable.Single<TSource> -Methode gibt das einzige Element einer Sequenz oder das einzige Element einer Sequenz, die eine angegebene Bedingung erfüllt. Wenn keine Elemente in der Sequenz vorhanden sind, oder wenn mehr als ein Element vorhanden ist, die Methode löst eine InvalidOperationException Ausnahme.

Sie können die Enumerable.SingleOrDefault<TSource> Methode, um einen Standardwert, anstatt eine Ausnahme auszulösen, wenn die Sequenz keine Elemente enthält zurückzugeben. Allerdings die Enumerable.SingleOrDefault<TSource> weiterhin Methode löst eine InvalidOperationException -Ausnahme aus, wenn die Sequenz mehr als ein Element enthält.

Die folgende Tabelle listet die Fehlermeldungen aus der InvalidOperationException Ausnahmeobjekte ausgelöst durch Aufrufe der Enumerable.Single<TSource> und Enumerable.SingleOrDefault<TSource> Methoden.

Methode

Message

Single 

Sequenz enthält kein übereinstimmendes element

Single
SingleOrDefault

Sequenz enthält mehrere übereinstimmende Elemente

Im folgenden Beispiel der Aufruf der Enumerable.Single<TSource> -Methode löst eine InvalidOperationException Ausnahme, da die Sequenz ein Element größer als 4 ist.

using System;
using System.Linq;

public class Example
{
   public static void Main()
   {
       int[] dbQueryResults = { 1, 2, 3, 4 };

       var singleObject = dbQueryResults.Single(value => value > 4);

       // Display results.
       Console.WriteLine("{0} is the only value greater than 4", singleObject);
   }
}
// The example displays the following output:
//    Unhandled Exception: System.InvalidOperationException: 
//       Sequence contains no matching element
//       at System.Linq.Enumerable.Single[TSource](IEnumerable`1 source, Func`2 predicate)
//       at Example.Main()

Im folgenden Beispiel wird versucht, um zu verhindern, dass die InvalidOperationException Ausnahme wird ausgelöst, wenn eine Sequenz leer ist, indem Sie stattdessen Aufrufen der Enumerable.SingleOrDefault<TSource> Methode. Da dieser Sequenz mehrere Elemente, deren Wert größer als 2 zurückgegeben, es auch löst jedoch eine InvalidOperationException Ausnahme.

using System;
using System.Linq;

public class Example
{
   public static void Main()
   {
       int[] dbQueryResults = { 1, 2, 3, 4 };

       var singleObject = dbQueryResults.SingleOrDefault(value => value > 2);

       if (singleObject != 0)
           Console.WriteLine("{0} is the only value greater than 2", 
                             singleObject);
       else
           // Handle an empty collection.
           Console.WriteLine("No value is greater than 2");
   }
}
// The example displays the following output:
//    Unhandled Exception: System.InvalidOperationException: 
//       Sequence contains more than one matching element
//       at System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable`1 source, Func`2 predicate)
//       at Example.Main()

Aufrufen der Enumerable.Single<TSource> Methode geht davon aus, dass eine Sequenz oder die Sequenz, die angegebenen Kriterien erfüllt nur ein Element enthält. Enumerable.SingleOrDefault<TSource> wird eine Sequenz mit keinem oder einem Ergebnis, aber nicht mehr angenommen. Wenn diese Annahme eine absichtliche ihrerseits ist und diese Bedingung nicht erfüllt werden, das erneute Auslösen oder abfangen, die resultierende InvalidOperationException eignet. Andernfalls, oder wenn Sie erwarten, dass ungültige Bedingungen häufig auftreten, sollten Sie mit einigen anderen Enumerable -Methode, wie z. B. FirstOrDefault<TSource> oder Where<TSource>.

Die OpCodes.Ldflda Microsoft intermediate Language (MSIL)-Anweisung löst eine InvalidOperationException -Ausnahme aus, wenn das Objekt mit dem Feld, dessen Adresse, die Sie abrufen möchten, nicht innerhalb der Anwendungsdomäne ist in der Code ausgeführt wird. Die Adresse eines Felds kann nur von der Anwendungsdomäne zugegriffen werden, in dem er sich befindet.

Lösen Sie eine InvalidOperationException Ausnahme nur, wenn Sie der Zustand des Objekts aus irgendeinem Grund nicht mit einen bestimmten Methodenaufruf unterstützt. Also der Methodenaufruf ist in einigen Fällen oder Kontexten zulässig, aber ist ungültig in anderen.

Wenn der Methodenaufruf durch ungültige Argumente ist ArgumentException oder eine der davon abgeleiteten Klassen, ArgumentNullException oder ArgumentOutOfRangeException, stattdessen ausgelöst werden soll.

InvalidOperationException verwendet HRESULT COR_E_INVALIDOPERATION mit dem Wert 0 x 80131509.

Eine Liste der anfänglichen Eigenschaftenwerte für eine Instanz von InvalidOperationException, finden Sie unter der InvalidOperationException Konstruktoren.

Universal Windows Platform
Verfügbar seit 8
.NET Framework
Verfügbar seit 1.1
Portable Class Library
Unterstützt in: portable .NET platforms
Silverlight
Verfügbar seit 2.0
Windows Phone Silverlight
Verfügbar seit 7.0
Windows Phone
Verfügbar seit 8.1

Öffentliche statische (in Visual Basic freigegebene) Member dieses Typs sind threadsicher. Bei Instanzmembern ist die Threadsicherheit nicht gewährleistet.

Zurück zum Anfang
Anzeigen:
© 2016 Microsoft