InvalidOperationException InvalidOperationException InvalidOperationException InvalidOperationException Class

Definición

Excepción que se produce cuando una llamada a un método no es válida para el estado actual del objeto.The exception that is thrown when a method call is invalid for the object's current state.

public ref class InvalidOperationException : SystemException
[System.Runtime.InteropServices.ComVisible(true)]
[System.Serializable]
public class InvalidOperationException : SystemException
type InvalidOperationException = class
    inherit SystemException
Public Class InvalidOperationException
Inherits SystemException
Herencia
InvalidOperationExceptionInvalidOperationExceptionInvalidOperationExceptionInvalidOperationException
Derivado
Atributos

Comentarios

InvalidOperationException se utiliza en los casos cuando se provocó el error al invocar un método por motivos distintos a argumentos no válidos.InvalidOperationException is used in cases when the failure to invoke a method is caused by reasons other than invalid arguments. Normalmente, se produce cuando el estado de un objeto no se admite la llamada al método.Typically, it is thrown when the state of an object cannot support the method call. Por ejemplo, un InvalidOperationException excepción la producen los métodos, como:For example, an InvalidOperationException exception is thrown by methods such as:

  • IEnumerator.MoveNext Si los objetos de una colección se modifican después de crear el enumerador.IEnumerator.MoveNext if objects of a collection are modified after the enumerator is created. Para obtener más información, consulte cambiar una colección que se va iterando lo.For more information, see Changing a collection while iterating it.

  • ResourceSet.GetString Si el conjunto de recursos está cerrado antes de se realiza la llamada al método.ResourceSet.GetString if the resource set is closed before the method call is made.

  • XContainer.Add, si el objeto u objetos agregarse daría como resultado en un documento XML estructurado incorrectamente.XContainer.Add, if the object or objects to be added would result in an incorrectly structured XML document.

  • Un método que intenta manipular la interfaz de usuario desde un subproceso que no es el principal o el subproceso de interfaz de usuario.A method that attempts to manipulate the UI from a thread that is not the main or UI thread.

Importante

Dado que el InvalidOperationException puede ser una excepción en una amplia variedad de circunstancias, es importante leer el mensaje de excepción devolviendo por la Message propiedad.Because the InvalidOperationException exception can be thrown in a wide variety of circumstances, it is important to read the exception message returned by the Message property.

En esta sección:In this section:

Algunas causas comunes de excepciones InvalidOperationException Some common causes of InvalidOperationException exceptions
Actualización de un subproceso de interfaz de usuario desde un subproceso que no son de interfaz de usuarioUpdating a UI thread from a non-UI thread
Cambiar una colección que se va iterando loChanging a collection while iterating it
Ordenar una matriz o colección cuyos objetos no se pueden compararSorting an array or collection whose objects cannot be compared
Convertir un tipo Nullable<T> null a su tipo subyacente Casting a Nullable<T> that is null to its underlying type
Llamar a un método System.Linq.Enumerable en una colección vacíaCalling a System.Linq.Enumerable method on an empty collection
Llamar a Enumerable.Single o Enumerable.SingleOrDefault en una secuencia sin un elementoCalling Enumerable.Single or Enumerable.SingleOrDefault on a sequence without one element
Acceso de campo dinámico entre dominios de aplicaciónDynamic cross-application domain field access
Producir una excepción InvalidOperationExceptionThrowing an InvalidOperationException exception
Información diversaMiscellaneous information

Algunas causas comunes de excepciones InvalidOperationExceptionSome common causes of InvalidOperationException exceptions

Las secciones siguientes muestran cómo algunos casos en que en InvalidOperationException se produce una excepción en una aplicación.The following sections show how some common cases in which in InvalidOperationException exception is thrown in an app. Cómo controlar el problema depende de la situación específica.How you handle the issue depends on the specific situation. Normalmente, sin embargo, la excepción da como resultado de error de desarrollador y el InvalidOperationException se puede prever y evitar la excepción.Most commonly, however, the exception results from developer error, and the InvalidOperationException exception can be anticipated and avoided.

Actualización de un subproceso de interfaz de usuario desde un subproceso que no son de interfaz de usuarioUpdating a UI thread from a non-UI thread

A menudo, los subprocesos de trabajo se usan para realizar algún trabajo en segundo plano que implica la recopilación de datos que se mostrará en la interfaz de usuario de la aplicación.Often, worker threads are used to perform some background work that involves gathering data to be displayed in an application's user interface. Sin embargo.However. la mayoría marcos de aplicaciones de GUI (interfaz gráfica de usuario) para .NET Framework, como Windows Forms y Windows Presentation Foundation (WPF) le permiten tener acceso a objetos de la GUI solo desde el subproceso que crea y administra la interfaz de usuario (el subproceso principal o la interfaz de usuario).most GUI (graphical user interface) application frameworks for the .NET Framework, such as Windows Forms and Windows Presentation Foundation (WPF), let you access GUI objects only from the thread that creates and manages the UI (the Main or UI thread). Un InvalidOperationException se produce cuando se intenta tener acceso a un elemento de interfaz de usuario desde un subproceso distinto del subproceso de interfaz de usuario.An InvalidOperationException is thrown when you try to access a UI element from a thread other than the UI thread. El texto del mensaje de excepción se muestra en la tabla siguiente.The text of the exception message is shown in the following table.

Tipo de aplicaciónApplication Type MensajeMessage
Aplicación WPFWPF app El subproceso de llamada no puede tener acceso a este objeto porque otro subproceso lo posee.The calling thread cannot access this object because a different thread owns it.
Aplicación para UWPUWP app La aplicación llama a una interfaz que se calcularon las referencias para un subproceso diferente.The application called an interface that was marshaled for a different thread.
Aplicación de Windows FormsWindows Forms app Operación de entre subprocesos no es válida: Control "TextBox1" acceso desde un subproceso distinto del subproceso que se haya creado.Cross-thread operation not valid: Control 'TextBox1' accessed from a thread other than the thread it was created on.

Marcos de interfaz de usuario para .NET Framework implementan un distribuidor patrón que incluye un método para comprobar si se está ejecutando una llamada a un miembro de un elemento de interfaz de usuario en el subproceso de interfaz de usuario y otros métodos para programar la llamada en el subproceso de interfaz de usuario:UI frameworks for the .NET Framework implement a dispatcher pattern that includes a method to check whether a call to a member of a UI element is being executed on the UI thread, and other methods to schedule the call on the UI thread:

  • En las aplicaciones WPF, llame a la Dispatcher.CheckAccess método para determinar si un método se ejecuta en un subproceso que no son de interfaz de usuario.In WPF apps, call the Dispatcher.CheckAccess method to determine if a method is running on a non-UI thread. Devuelve true si el método se ejecuta en el subproceso de UI y false en caso contrario.It returns true if the method is running on the UI thread and false otherwise. Llamar a una de las sobrecargas de los Dispatcher.Invoke método para programar la llamada en el subproceso de interfaz de usuario.Call one of the overloads of the Dispatcher.Invoke method to schedule the call on the UI thread.

  • En aplicaciones UWP, llame a la CoreDispatcher.HasThreadAccess método para determinar si un método se ejecuta en un subproceso que no son de interfaz de usuario.In UWP apps, call the CoreDispatcher.HasThreadAccess method to determine if a method is running on a non-UI thread. Llame a la CoreDispatcher.RunAsync método se debe ejecutar un delegado que actualice el subproceso de interfaz de usuario.Call the CoreDispatcher.RunAsync method to execute a delegate that updates the UI thread. Use elUse the

  • En las aplicaciones de Windows Forms, use la Control.InvokeRequired propiedad para determinar si un método se ejecuta en un subproceso que no son de interfaz de usuario.In Windows Forms apps, use the Control.InvokeRequired property to determine if a method is running on a non-UI thread. Llamar a una de las sobrecargas de los Control.Invoke método se debe ejecutar un delegado que actualice el subproceso de interfaz de usuario.Call one of the overloads of the Control.Invoke method to execute a delegate that updates the UI thread.

Los ejemplos siguientes ilustran la InvalidOperationException excepción que se produce cuando se intenta actualizar un elemento de interfaz de usuario desde un subproceso distinto del subproceso que lo creó.The following examples illustrate the InvalidOperationException exception that is thrown when you attempt to update a UI element from a thread other than the thread that created it. Cada ejemplo requiere la creación de dos controles:Each example requires that you create two controls:

  • Un control de cuadro de texto denominado textBox1.A text box control named textBox1. En una aplicación de Windows Forms, debe establecer su Multiline propiedad true.In a Windows Forms app, you should set its Multiline property to true.

  • Un control de botón denominado threadExampleBtn.A button control named threadExampleBtn. En el ejemplo se proporciona un controlador, ThreadsExampleBtn_Click, para el botón Click eventos.The example provides a handler, ThreadsExampleBtn_Click, for the button's Click event.

En cada caso, el threadExampleBtn_Click llamadas del controlador de eventos el DoSomeWork método dos veces.In each case, the threadExampleBtn_Click event handler calls the DoSomeWork method twice. La primera llamada se ejecuta sincrónicamente y se realiza correctamente.The first call runs synchronously and succeeds. Pero la segunda llamada, porque se ejecuta de forma asincrónica en un subproceso de grupo, al intenta actualizar la interfaz de usuario desde un subproceso que no son de interfaz de usuario.But the second call, because it runs asynchronously on a thread pool thread, attempts to update the UI from a non-UI thread. Esto da como resultado un InvalidOperationException excepción.This results in a InvalidOperationException exception.

Aplicaciones de WPF y UWPWPF and 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;
}
Private Async Sub threadExampleBtn_Click(sender As Object, e As RoutedEventArgs) Handles threadExampleBtn.Click
    textBox1.Text = String.Empty

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

    textBox1.Text += "Simulating work on non-UI thread." + vbCrLf
    Await Task.Factory.StartNew(Sub()
                                    DoSomeWork(1000)
                                End Sub)
    textBox1.Text += "Work completed..." + vbCrLf
End Sub

Private Async Sub DoSomeWork(milliseconds As Integer)
    ' Simulate work.
    Await Task.Delay(milliseconds)

    ' Report completion.
    Dim msg = String.Format("Some work completed in {0} ms.", milliseconds) + vbCrLf
    textBox1.Text += msg
End Sub

La siguiente versión de la DoSomeWork método elimina la excepción en una aplicación WPF.The following version of the DoSomeWork method eliminates the exception in a WPF app.

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; });
}
Private Async Sub DoSomeWork(milliseconds As Integer)
    ' Simulate work.
    Await Task.Delay(milliseconds)

    ' Report completion.
    Dim uiAccess As Boolean = textBox1.Dispatcher.CheckAccess()
    Dim msg As String = String.Format("Some work completed in {0} ms. on {1}UI thread",
                                      milliseconds, If(uiAccess, String.Empty, "non-")) + 
                                      vbCrLf 
    If uiAccess Then
        textBox1.Text += msg
    Else
        textBox1.Dispatcher.Invoke( Sub() textBox1.Text += msg)
    End If
End Sub

La siguiente versión de la DoSomeWork método elimina la excepción en una aplicación para UWP.The following version of the DoSomeWork method eliminates the exception in a 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; });
}
Private Async Sub DoSomeWork(milliseconds As Integer)
    ' Simulate work.
    Await Task.Delay(milliseconds)

    ' Report completion.
    Dim uiAccess As Boolean = textBox1.Dispatcher.HasThreadAccess
    Dim msg As String = String.Format("Some work completed in {0} ms. on {1}UI thread" + vbCrLf,
                                      milliseconds, If(uiAccess, String.Empty, "non-"))
    If (uiAccess) Then
        textBox1.Text += msg
    Else
        Await textBox1.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, Sub() textBox1.Text += msg)
    End If
End Sub

Aplicaciones de Windows FormsWindows Forms apps

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();
}
Dim lines As New List(Of String)()
Private Async Sub threadExampleBtn_Click(sender As Object, e As EventArgs) Handles threadExampleBtn.Click
    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(Sub() DoSomeWork(1000))

    lines.Add("ThreadsExampleBtn_Click completes. ")
    textBox1.Lines = lines.ToArray()
End Sub

Private Async Sub DoSomeWork(milliseconds As Integer)
    ' 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()
End Sub

La siguiente versión de la DoSomeWork método elimina la excepción en una aplicación de Windows Forms.The following version of the DoSomeWork method eliminates the exception in a Windows Forms app.

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();
    }
}
Private Async Sub DoSomeWork(milliseconds As Integer)
    ' Simulate work.
    Await Task.Delay(milliseconds)

    ' Report completion.
    Dim uiMarshal As Boolean = textBox1.InvokeRequired
    Dim msg As String = String.Format("Some work completed in {0} ms. on {1}UI thread" + vbCrLf,
                                      milliseconds, If(uiMarshal, String.Empty, "non-"))
    lines.Add(msg)

    If uiMarshal Then
        textBox1.Invoke(New Action(Sub() textBox1.Lines = lines.ToArray()))
    Else
        textBox1.Lines = lines.ToArray()
    End If
End Sub

Cambiar una colección que se va iterando loChanging a collection while iterating it

El foreach instrucción en C# o For Each instrucción en Visual Basic se usa para recorrer en iteración los miembros de una colección y para leer o modificar sus elementos individuales.The foreach statement in C# or For Each statement in Visual Basic is used to iterate the members of a collection and to read or modify its individual elements. Sin embargo, no se puede usar para agregar o quitar elementos de la colección.However, it can't be used to add or remove items from the collection. Al hacerlo se inicia un InvalidOperationException excepción con un mensaje similar a "colección modificada; no puede ejecutar la operación de enumeración. "Doing this throws an InvalidOperationException exception with a message that is similar to, "Collection was modified; enumeration operation may not execute."

El ejemplo siguiente se recorre en iteración una colección de enteros que intenta agregar el cuadrado de cada entero a la colección.The following example iterates a collection of integers attempts to add the square of each integer to the collection. El ejemplo se inicia un InvalidOperationException con la primera llamada a la List<T>.Add método.The example throws an InvalidOperationException with the first call to the List<T>.Add method.

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()
Imports System.Collections.Generic

Module Example
   Public Sub Main()
      Dim numbers As New List(Of Integer)( { 1, 2, 3, 4, 5 } )
      For Each number In numbers
         Dim square As Integer = CInt(Math.Pow(number, 2))
         Console.WriteLine("{0}^{1}", number, square)
         Console.WriteLine("Adding {0} to the collection..." + vbCrLf, 
                           square)
         numbers.Add(square)
      Next
   End Sub
End Module
' 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()

Puede eliminar la excepción de dos maneras, según la lógica de aplicación:You can eliminate the exception in one of two ways, depending on your application logic:

  • Si los elementos deben agregarse a la colección que se va iterando él, puede iterar mediante el uso del índice la for instrucción en lugar de foreach o For Each.If elements must be added to the collection while iterating it, you can iterate it by index using the for statement instead of foreach or For Each. En el ejemplo siguiente se utiliza la instrucción for para agregar el cuadrado de los números en la colección a la colección.The following example uses the for statement to add the square of numbers in the collection to the collection.

    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
    
    Imports System.Collections.Generic
    
    Module Example
       Public Sub Main()
          Dim numbers As New List(Of Integer)( { 1, 2, 3, 4, 5 } )
          Dim upperBound = numbers.Count - 1
    
          For ctr As Integer = 0 To upperBound
             Dim square As Integer = CInt(Math.Pow(numbers(ctr), 2))
             Console.WriteLine("{0}^{1}", numbers(ctr), square)
             Console.WriteLine("Adding {0} to the collection..." + vbCrLf, 
                               square)
             numbers.Add(square)
          Next
       
          Console.WriteLine("Elements now in the collection: ")
          For Each number In numbers
             Console.Write("{0}    ", number)
          Next   
       End Sub
    End Module
    ' 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
    

    Tenga en cuenta que debe establecer el número de iteraciones antes de recorrer en iteración la colección mediante el uso de un contador del bucle que se cerrará el bucle de forma adecuada, mediante la iteración hacia atrás, desde Count - 1 a 0, o bien, como en el ejemplo, asignando el número de elementos de la matriz a una variable y usarlo para establecer el límite superior del bucle.Note that you must establish the number of iterations before iterating the collection either by using a counter inside the loop that will exit the loop appropriately, by iterating backward, from Count - 1 to 0, or, as the example does, by assigning the number of elements in the array to a variable and using it to establish the upper bound of the loop. En caso contrario, si se agrega un elemento a la colección en cada iteración, se produce un bucle sin fin.Otherwise, if an element is added to the collection on every iteration, an endless loop results.

  • Si no es necesario agregar elementos a la colección que se va iterando a él, puede almacenar los elementos se agreguen en una recopilación temporal que agregue cuando ha terminado de recorrer en iteración la colección.If it is not necessary to add elements to the collection while iterating it, you can store the elements to be added in a temporary collection that you add when iterating the collection has finished. En el ejemplo siguiente se usa este enfoque para agregar el cuadrado de los números de una colección en una recopilación temporal y luego combinar las colecciones en un objeto de matriz único.The following example uses this approach to add the square of numbers in a collection to a temporary collection, and then to combine the collections into a single array object.

    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
    
    Imports System.Collections.Generic
    
    Module Example
       Public Sub Main()
          Dim numbers As New List(Of Integer)( { 1, 2, 3, 4, 5 } )
          Dim temp As New List(Of Integer)()
          
          ' Square each number and store it in a temporary collection.
          For Each number In numbers
             Dim square As Integer = CInt(Math.Pow(number, 2))
             temp.Add(square)
          Next
        
          ' Combine the numbers into a single array.
          Dim combined(numbers.Count + temp.Count - 1) As Integer 
          Array.Copy(numbers.ToArray(), 0, combined, 0, numbers.Count)
          Array.Copy(temp.ToArray(), 0, combined, numbers.Count, temp.Count)
          
          ' Iterate the array.
          For Each value In combined
             Console.Write("{0}    ", value)
          Next
       End Sub
    End Module
    ' The example displays the following output:
    '       1    2    3    4    5    1    4    9    16    25
    

Ordenar una matriz o colección cuyos objetos no se pueden compararSorting an array or collection whose objects cannot be compared

Uso general de ordenación de los métodos, como el Array.Sort(Array) método o el List<T>.Sort() método, normalmente le exigen que al menos uno de los objetos que se van a implementar el IComparable<T> o el IComparable interfaz.General-purpose sorting methods, such as the Array.Sort(Array) method or the List<T>.Sort() method, usually require that at least one of the objects to be sorted implement the IComparable<T> or the IComparable interface. Si no, no se pueden ordenar la colección o matriz y el método produce una InvalidOperationException excepción.If not, the collection or array cannot be sorted, and the method throws an InvalidOperationException exception. En el ejemplo siguiente se define un Person clase almacena dos Person objetos en un tipo genérico List<T> objeto y los intentos para ordenarlos.The following example defines a Person class, stores two Person objects in a generic List<T> object, and attempts to sort them. Como se muestra en el ejemplo, la llamada a la salida del List<T>.Sort() método produce una InvalidOperationException.As the output from the example shows, the call to the List<T>.Sort() method throws an InvalidOperationException.

using System;
using System.Collections.Generic;

public class Person
{
   public Person(String fName, String lName)
   {
      FirstName = fName;
      LastName = lName;
   }
   
   public String FirstName { get; set; }
   public String LastName { get; set; }
}

public class Example
{
   public static void Main()
   {
      var people = new List<Person>();
      
      people.Add(new Person("John", "Doe"));
      people.Add(new Person("Jane", "Doe"));
      people.Sort();
      foreach (var person in people)
         Console.WriteLine("{0} {1}", person.FirstName, person.LastName);
   }
}
// The example displays the following output:
//    Unhandled Exception: System.InvalidOperationException: Failed to compare two elements in the array. ---> 
//       System.ArgumentException: At least one object must implement IComparable.
//       at System.Collections.Comparer.Compare(Object a, Object b)
//       at System.Collections.Generic.ArraySortHelper`1.SwapIfGreater(T[] keys, IComparer`1 comparer, Int32 a, Int32 b)
//       at System.Collections.Generic.ArraySortHelper`1.DepthLimitedQuickSort(T[] keys, Int32 left, Int32 right, IComparer`1 comparer, Int32 depthLimit)
//       at System.Collections.Generic.ArraySortHelper`1.Sort(T[] keys, Int32 index, Int32 length, IComparer`1 comparer)
//       --- End of inner exception stack trace ---
//       at System.Collections.Generic.ArraySortHelper`1.Sort(T[] keys, Int32 index, Int32 length, IComparer`1 comparer)
//       at System.Array.Sort[T](T[] array, Int32 index, Int32 length, IComparer`1 comparer)
//       at System.Collections.Generic.List`1.Sort(Int32 index, Int32 count, IComparer`1 comparer)
//       at Example.Main()
Imports System.Collections.Generic

Public Class Person
   Public Sub New(fName As String, lName As String)
      FirstName = fName
      LastName = lName
   End Sub
   
   Public Property FirstName As String
   Public Property LastName As String
End Class

Module Example
   Public Sub Main()
      Dim people As New List(Of Person)()
      
      people.Add(New Person("John", "Doe"))
      people.Add(New Person("Jane", "Doe"))
      people.Sort()
      For Each person In people
         Console.WriteLine("{0} {1}", person.FirstName, person.LastName)
      Next
   End Sub
End Module
' The example displays the following output:
'    Unhandled Exception: System.InvalidOperationException: Failed to compare two elements in the array. ---> 
'       System.ArgumentException: At least one object must implement IComparable.
'       at System.Collections.Comparer.Compare(Object a, Object b)
'       at System.Collections.Generic.ArraySortHelper`1.SwapIfGreater(T[] keys, IComparer`1 comparer, Int32 a, Int32 b)
'       at System.Collections.Generic.ArraySortHelper`1.DepthLimitedQuickSort(T[] keys, Int32 left, Int32 right, IComparer`1 comparer, Int32 depthLimit)
'       at System.Collections.Generic.ArraySortHelper`1.Sort(T[] keys, Int32 index, Int32 length, IComparer`1 comparer)
'       --- End of inner exception stack trace ---
'       at System.Collections.Generic.ArraySortHelper`1.Sort(T[] keys, Int32 index, Int32 length, IComparer`1 comparer)
'       at System.Array.Sort[T](T[] array, Int32 index, Int32 length, IComparer`1 comparer)
'       at System.Collections.Generic.List`1.Sort(Int32 index, Int32 count, IComparer`1 comparer)
'       at Example.Main()

Puede eliminar la excepción en cualquiera de estas tres maneras:You can eliminate the exception in any of three ways:

  • Si tiene el tipo que desea ordenar (es decir, si el control de su código fuente), puede modificarla para implementar la IComparable<T> o IComparable interfaz.If you can own the type that you are trying to sort (that is, if you control its source code), you can modify it to implement the IComparable<T> or the IComparable interface. Esto requiere que se implemente el IComparable<T>.CompareTo o CompareTo método.This requires that you implement either the IComparable<T>.CompareTo or the CompareTo method. Adición de una implementación de interfaz a un tipo existente no es un cambio importante.Adding an interface implementation to an existing type is not a breaking change.

    En el ejemplo siguiente se usa este enfoque para proporcionar un IComparable<T> implementación para el Person clase.The following example uses this approach to provide an IComparable<T> implementation for the Person class. Todavía puede llamar a la colección o el método de ordenación general de la matriz y, como se muestra el resultado del ejemplo, la colección se ordena correctamente.You can still call the collection or array's general sorting method and, as the output from the example shows, the collection sorts successfully.

    using System;
    using System.Collections.Generic;
    
    public class Person : IComparable<Person>
    {
       public Person(String fName, String lName)
       {
          FirstName = fName;
          LastName = lName;
       }
       
       public String FirstName { get; set; }
       public String LastName { get; set; }
    
       public int CompareTo(Person other)
       {
          return String.Format("{0} {1}", LastName, FirstName).
                 CompareTo(String.Format("{0} {1}", LastName, FirstName));    
       }       
    }
    
    public class Example
    {
       public static void Main()
       {
          var people = new List<Person>();
          
          people.Add(new Person("John", "Doe"));
          people.Add(new Person("Jane", "Doe"));
          people.Sort();
          foreach (var person in people)
             Console.WriteLine("{0} {1}", person.FirstName, person.LastName);
       }
    }
    // The example displays the following output:
    //       Jane Doe
    //       John Doe
    
    Imports System.Collections.Generic
    
    Public Class Person : Implements IComparable(Of Person)
       Public Sub New(fName As String, lName As String)
          FirstName = fName
          LastName = lName
       End Sub
       
       Public Property FirstName As String
       Public Property LastName As String
       
       Public Function CompareTo(other As Person) As Integer _
              Implements IComparable(Of Person).CompareTo
          Return String.Format("{0} {1}", LastName, FirstName).
                 CompareTo(String.Format("{0} {1}", LastName, FirstName))    
       End Function       
    End Class
    
    Module Example
       Public Sub Main()
          Dim people As New List(Of Person)()
          
          people.Add(New Person("John", "Doe"))
          people.Add(New Person("Jane", "Doe"))
          people.Sort()
          For Each person In people
             Console.WriteLine("{0} {1}", person.FirstName, person.LastName)
          Next
       End Sub
    End Module
    ' The example displays the following output:
    '       Jane Doe
    '       John Doe
    
  • Si no se puede modificar el código fuente para el tipo que desea ordenar, puede definir una clase de ordenación con una finalidad especial que implementa el IComparer<T> interfaz.If you cannot modify the source code for the type you are trying to sort, you can define a special-purpose sorting class that implements the IComparer<T> interface. Puede llamar a una sobrecarga de la Sort método que incluye un IComparer<T> parámetro.You can call an overload of the Sort method that includes an IComparer<T> parameter. Este enfoque es especialmente útil si desea desarrollar una clase de ordenación especializada que se puede ordenar los objetos según varios criterios.This approach is especially useful if you want to develop a specialized sorting class that can sort objects based on multiple criteria.

    En el ejemplo siguiente se usa el enfoque mediante el desarrollo personalizado PersonComparer clase que se usa para ordenar Person colecciones.The following example uses the approach by developing a custom PersonComparer class that is used to sort Person collections. A continuación, pasa una instancia de esta clase para el List<T>.Sort(IComparer<T>) método.It then passes an instance of this class to the List<T>.Sort(IComparer<T>) method.

    using System;
    using System.Collections.Generic;
    
    public class Person
    {
       public Person(String fName, String lName)
       {
          FirstName = fName;
          LastName = lName;
       }
       
       public String FirstName { get; set; }
       public String LastName { get; set; }
    }
    
    public class PersonComparer : IComparer<Person>
    {
       public int Compare(Person x, Person y) 
       {
          return String.Format("{0} {1}", x.LastName, x.FirstName).
                 CompareTo(String.Format("{0} {1}", y.LastName, y.FirstName));    
       }       
    }
    
    public class Example
    {
       public static void Main()
       {
          var people = new List<Person>();
          
          people.Add(new Person("John", "Doe"));
          people.Add(new Person("Jane", "Doe"));
          people.Sort(new PersonComparer());
          foreach (var person in people)
             Console.WriteLine("{0} {1}", person.FirstName, person.LastName);
       }
    }
    // The example displays the following output:
    //       Jane Doe
    //       John Doe
    
    Imports System.Collections.Generic
    
    Public Class Person
       Public Sub New(fName As String, lName As String)
          FirstName = fName
          LastName = lName
       End Sub
       
       Public Property FirstName As String
       Public Property LastName As String
    End Class
    
    Public Class PersonComparer : Implements IComparer(Of Person)
       Public Function Compare(x As Person, y As Person) As Integer _
              Implements IComparer(Of Person).Compare
          Return String.Format("{0} {1}", x.LastName, x.FirstName).
                 CompareTo(String.Format("{0} {1}", y.LastName, y.FirstName))    
       End Function       
    End Class
    
    Module Example
       Public Sub Main()
          Dim people As New List(Of Person)()
          
          people.Add(New Person("John", "Doe"))
          people.Add(New Person("Jane", "Doe"))
          people.Sort(New PersonComparer())
          For Each person In people
             Console.WriteLine("{0} {1}", person.FirstName, person.LastName)
          Next
       End Sub
    End Module
    ' The example displays the following output:
    '       Jane Doe
    '       John Doe
    
  • Si no se puede modificar el código fuente para el tipo intenta ordenar, puede crear un Comparison<T> delegado para realizar la ordenación.If you cannot modify the source code for the type you are trying to sort, you can create a Comparison<T> delegate to perform the sorting. Es la firma del delegadoThe delegate signature is

    Function Comparison(Of T)(x As T, y As T) As Integer  
    
    int Comparison<T>(T x, T y)  
    

    En el ejemplo siguiente se usa el enfoque definiendo un PersonComparison método que coincide con el Comparison<T> firma de delegado.The following example uses the approach by defining a PersonComparison method that matches the Comparison<T> delegate signature. A continuación, pasa este delegado para el List<T>.Sort(Comparison<T>) método.It then passes this delegate to the List<T>.Sort(Comparison<T>) method.

    using System;
    using System.Collections.Generic;
    
    public class Person
    {
       public Person(String fName, String lName)
       {
          FirstName = fName;
          LastName = lName;
       }
       
       public String FirstName { get; set; }
       public String LastName { get; set; }
    }
    
    public class Example
    {
       public static void Main()
       {
          var people = new List<Person>();
          
          people.Add(new Person("John", "Doe"));
          people.Add(new Person("Jane", "Doe"));
          people.Sort(PersonComparison);
          foreach (var person in people)
             Console.WriteLine("{0} {1}", person.FirstName, person.LastName);
       }
    
       public static int PersonComparison(Person x, Person y)
       {
          return String.Format("{0} {1}", x.LastName, x.FirstName).
                 CompareTo(String.Format("{0} {1}", y.LastName, y.FirstName));    
       }
    }
    // The example displays the following output:
    //       Jane Doe
    //       John Doe
    
    Imports System.Collections.Generic
    
    Public Class Person
       Public Sub New(fName As String, lName As String)
          FirstName = fName
          LastName = lName
       End Sub
       
       Public Property FirstName As String
       Public Property LastName As String
    End Class
    
    Module Example
       Public Sub Main()
          Dim people As New List(Of Person)()
          
          people.Add(New Person("John", "Doe"))
          people.Add(New Person("Jane", "Doe"))
          people.Sort(AddressOf PersonComparison)
          For Each person In people
             Console.WriteLine("{0} {1}", person.FirstName, person.LastName)
          Next
       End Sub
       
       Public Function PersonComparison(x As Person, y As Person) As Integer
          Return String.Format("{0} {1}", x.LastName, x.FirstName).
                 CompareTo(String.Format("{0} {1}", y.LastName, y.FirstName))    
       End Function
    End Module
    ' The example displays the following output:
    '       Jane Doe
    '       John Doe
    

Convertir un tipo Nullable<T > que es null para su tipo subyacenteCasting a Nullable<T> that is null to its underlying type

Intenta convertir un Nullable<T> valor que es null a su tipo subyacente produce una InvalidOperationException excepción y muestra el mensaje de error "objeto que acepta valores NULL debe tener un valor.Attempting to cast a Nullable<T> value that is null to its underlying type throws an InvalidOperationException exception and displays the error message, "Nullable object must have a value.

En el ejemplo siguiente se inicia un InvalidOperationException excepción cuando intenta recorrer en iteración una matriz que incluye un Nullable(Of Integer) valor.The following example throws an InvalidOperationException exception when it attempts to iterate an array that includes a Nullable(Of Integer) value.

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()
Imports System.Linq

Module Example
   Public Sub Main()
      Dim queryResult = New Integer?() { 1, 2, Nothing, 4 }
      Dim map = queryResult.Select(Function(nullableInt) CInt(nullableInt))
      
      ' Display list.
      For Each num In map
         Console.Write("{0} ", num)
      Next
      Console.WriteLine()   
   End Sub
End Module
' The example displays thIe 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()

Para evitar la excepción:To prevent the exception:

El ejemplo siguiente lleva a cabo ambos para evitar la InvalidOperationException excepción.The following example does both to avoid the InvalidOperationException exception.

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
Imports System.Linq

Module Example
   Public Sub Main()
      Dim queryResult = New Integer?() { 1, 2, Nothing, 4 }
      Dim numbers = queryResult.Select(Function(nullableInt) _ 
                                          CInt(nullableInt.GetValueOrDefault()))
      ' Display list.
      For Each number In numbers
         Console.Write("{0} ", number)
      Next
      Console.WriteLine()
      
      ' Use -1 to indicate a missing values.
      numbers = queryResult.Select(Function(nullableInt) _   
                                      CInt(If(nullableInt.HasValue, nullableInt, -1)))
      ' Display list.
      For Each number In numbers
         Console.Write("{0} ", number)
      Next
      Console.WriteLine()
                                      
   End Sub
End Module
' The example displays the following output:
'       1 2 0 4
'       1 2 -1 4

Llamar a un método System.Linq.Enumerable en una colección vacíaCalling a System.Linq.Enumerable method on an empty collection

El Enumerable.Aggregate, Enumerable.Average, Enumerable.First, Enumerable.Last, Enumerable.Max, Enumerable.Min, Enumerable.Single, y Enumerable.SingleOrDefault métodos realizan operaciones en una secuencia y devolver un único resultado.The Enumerable.Aggregate, Enumerable.Average, Enumerable.First, Enumerable.Last, Enumerable.Max, Enumerable.Min, Enumerable.Single, and Enumerable.SingleOrDefault methods perform operations on a sequence and return a single result. Algunas sobrecargas de estos métodos producen un InvalidOperationException excepción cuando la secuencia está vacía, mientras que otras sobrecargas devuelven null.Some overloads of these methods throw an InvalidOperationException exception when the sequence is empty, while other overloads return null. El Enumerable.SingleOrDefault método también produce una InvalidOperationException excepción cuando la secuencia contiene más de un elemento.The Enumerable.SingleOrDefault method also throws an InvalidOperationException exception when the sequence contains more than one element.

Nota

La mayoría de los métodos que inician un InvalidOperationException excepción son sobrecargas.Most of the methods that throw an InvalidOperationException exception are overloads. Asegúrese de que comprende el comportamiento de la sobrecarga que elija.Be sure that you understand the behavior of the overload that you choose.

En la tabla siguiente se muestra los mensajes de excepción desde el InvalidOperationException producidos por las llamadas a algunos de los objetos de excepción System.Linq.Enumerable métodos.The following table lists the exception messages from the InvalidOperationException exception objects thrown by calls to some System.Linq.Enumerable methods.

MétodoMethod MensajeMessage
Aggregate
Average
Last
Max
Min
Secuencia no contiene elementosSequence contains no elements
First Secuencia no contiene ningún elemento coincidenteSequence contains no matching element
Single
SingleOrDefault
Secuencia contiene más de un elemento coincidenteSequence contains more than one matching element

Cómo eliminar o controlar la excepción depende en suposiciones de su aplicación y el método concreto llamar a.How you eliminate or handle the exception depends on your application's assumptions and on the particular method you call.

Los ejemplos proporcionan detalles adicionales.The examples provide additional detail.

En el ejemplo siguiente se usa el Enumerable.Average método para calcular el promedio de una secuencia cuyos valores son mayores que 4.The following example uses the Enumerable.Average method to compute the average of a sequence whose values are greater than 4. Dado que ningún valor de la matriz original supera los 4, valores no se incluyen en la secuencia y el método produce una InvalidOperationException excepción.Since no values from the original array exceed 4, no values are included in the sequence, and the method throws an InvalidOperationException exception.

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()
Imports System.Linq

Module Example
   Public Sub Main()
      Dim data() As Integer = { 1, 2, 3, 4 }
      Dim average = data.Where(Function(num) num > 4).Average()
      Console.Write("The average of numbers greater than 4 is {0}",
                    average)
   End Sub
End Module
' 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()

La excepción que se puede eliminar mediante una llamada a la Any método para determinar si la secuencia contiene elementos antes de llamar al método que procesa la secuencia, como se muestra en el ejemplo siguiente.The exception can be eliminated by calling the Any method to determine whether the sequence contains any elements before calling the method that processes the sequence, as the following example shows.

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.
Imports System.Linq

Module Example
   Public Sub Main()
       Dim dbQueryResults() As Integer = { 1, 2, 3, 4 }
       Dim moreThan4 = dbQueryResults.Where(Function(num) num > 4)
   
       If moreThan4.Any() Then
           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.")
       End If    
   End Sub
End Module
' The example displays the following output:
'       The dataset has no values greater than 4.

El Enumerable.First método devuelve el primer elemento en una secuencia o el primer elemento de una secuencia que satisface una condición especificada.The Enumerable.First method returns the first item in a sequence or the first element in a sequence that satisfies a specified condition. Si la secuencia está vacía y, por tanto, no tiene un primer elemento, produce un InvalidOperationException excepción.If the sequence is empty and therefore does not have a first element, it throws an InvalidOperationException exception.

En el ejemplo siguiente, la Enumerable.First<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) método produce una InvalidOperationException excepción porque la matriz de dbQueryResults no contiene ningún elemento mayor que 4.In the following example, the Enumerable.First<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) method throws an InvalidOperationException exception because the dbQueryResults array doesn't contain an element greater than 4.

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()
Imports System.Linq

Module Example
   Public Sub Main()
      Dim dbQueryResults() As Integer = { 1, 2, 3, 4 }

      Dim firstNum = dbQueryResults.First(Function(n) n > 4)

      Console.WriteLine("The first value greater than 4 is {0}", 
                        firstNum)
   End Sub
End Module
' 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()

Puede llamar a la Enumerable.FirstOrDefault método en lugar de Enumerable.First para devolver una especificada o el valor predeterminado.You can call the Enumerable.FirstOrDefault method instead of Enumerable.First to return a specified or default value. Si el método no encuentra un primer elemento de la secuencia, devuelve el valor predeterminado de ese tipo de datos.If the method does not find a first element in the sequence, it returns the default value for that data type. El valor predeterminado es null para un tipo de referencia, cero para un tipo de datos numéricos, y DateTime.MinValue para el DateTime tipo.The default value is null for a reference type, zero for a numeric data type, and DateTime.MinValue for the DateTime type.

Nota

Interpretar el valor devuelto por la Enumerable.FirstOrDefault método a menudo resulta complicado por el hecho de que el valor predeterminado del tipo puede ser un valor válido en la secuencia.Interpreting the value returned by the Enumerable.FirstOrDefault method is often complicated by the fact that the default value of the type can be a valid value in the sequence. En este caso, es una llamada a la Enumerable.Any método para determinar si la secuencia tiene miembros válidos antes de llamar a la Enumerable.First método.In this case, you an call the Enumerable.Any method to determine whether the sequence has valid members before calling the Enumerable.First method.

El ejemplo siguiente se llama el Enumerable.FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) método para impedir que el InvalidOperationException excepción producida en el ejemplo anterior.The following example calls the Enumerable.FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) method to prevent the InvalidOperationException exception thrown in the previous example.

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.
Imports System.Linq

Module Example
   Public Sub Main()
      Dim dbQueryResults() As Integer = { 1, 2, 3, 4 }

      Dim firstNum = dbQueryResults.FirstOrDefault(Function(n) n > 4)

      If firstNum = 0 Then
         Console.WriteLIne("No value is greater than 4.")
      Else   
         Console.WriteLine("The first value greater than 4 is {0}", 
                           firstNum)
      End If                     
   End Sub
End Module
' The example displays the following output:
'       No value is greater than 4.

Llamar a Enumerable.Single o Enumerable.SingleOrDefault en una secuencia sin un elementoCalling Enumerable.Single or Enumerable.SingleOrDefault on a sequence without one element

El Enumerable.Single método devuelve el único elemento de una secuencia o el único elemento de una secuencia que satisface una condición especificada.The Enumerable.Single method returns the only element of a sequence, or the only element of a sequence that meets a specified condition. Si no hay ningún elemento en la secuencia, o si hay más de un elemento, el método produce una InvalidOperationException excepción.If there are no elements in the sequence, or if there is more than one element , the method throws an InvalidOperationException exception.

Puede usar el Enumerable.SingleOrDefault método devuelva un valor predeterminado en lugar de producir una excepción cuando la secuencia no contiene ningún elemento.You can use the Enumerable.SingleOrDefault method to return a default value instead of throwing an exception when the sequence contains no elements. Sin embargo, el Enumerable.SingleOrDefault método lanza una InvalidOperationException excepción cuando la secuencia contiene más de un elemento.However, the Enumerable.SingleOrDefault method still throws an InvalidOperationException exception when the sequence contains more than one element.

En la tabla siguiente se muestra los mensajes de excepción desde el InvalidOperationException los objetos de excepción producidos por las llamadas a la Enumerable.Single y Enumerable.SingleOrDefault métodos.The following table lists the exception messages from the InvalidOperationException exception objects thrown by calls to the Enumerable.Single and Enumerable.SingleOrDefault methods.

MétodoMethod MensajeMessage
Single Secuencia no contiene ningún elemento coincidenteSequence contains no matching element
Single
SingleOrDefault
Secuencia contiene más de un elemento coincidenteSequence contains more than one matching element

En el ejemplo siguiente, la llamada a la Enumerable.Single método produce una InvalidOperationException excepción porque la secuencia no tiene ningún elemento mayor que 4.In the following example, the call to the Enumerable.Single method throws an InvalidOperationException exception because the sequence doesn't have an element greater than 4.

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()
Imports System.Linq

Module Example
   Public Sub Main()
       Dim dbQueryResults() As Integer = { 1, 2, 3, 4 }
   
       Dim singleObject = dbQueryResults.Single(Function(value) value > 4)
   
       ' Display results.
       Console.WriteLine("{0} is the only value greater than 4", 
                         singleObject)
   End Sub
End Module
' 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()

El ejemplo siguiente se intenta evitar el InvalidOperationException excepción que se produce cuando una secuencia está vacía llamando en su lugar el Enumerable.SingleOrDefault método.The following example attempts to prevent the InvalidOperationException exception thrown when a sequence is empty by instead calling the Enumerable.SingleOrDefault method. Sin embargo, dado que esta secuencia devuelve varios elementos cuyo valor es mayor que 2, también produce una InvalidOperationException excepción.However, because this sequence returns multiple elements whose value is greater than 2, it also throws an InvalidOperationException exception.

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()
Imports System.Linq

Module Example
   Public Sub Main()
       Dim dbQueryResults() As Integer = { 1, 2, 3, 4 }
   
       Dim singleObject = dbQueryResults.SingleOrDefault(Function(value) value > 2)
   
       If singleObject <> 0 Then
           Console.WriteLine("{0} is the only value greater than 2", 
                             singleObject)
       Else
           ' Handle an empty collection.
           Console.WriteLine("No value is greater than 2")
       End If    
   End Sub
End Module
' 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()

Una llamada a la Enumerable.Single método supone que una secuencia o la secuencia que cumpla los criterios especificados contiene un solo elemento.Calling the Enumerable.Single method assumes that either a sequence or the sequence that meets specified criteria contains only one element. Enumerable.SingleOrDefault se da por supuesto una secuencia con cero o un resultado, pero no más.Enumerable.SingleOrDefault assumes a sequence with zero or one result, but no more. Si esta suposición es deliberado por su parte y no se cumplen estas condiciones, volver a producir o detectar resultante InvalidOperationException es adecuado.If this assumption is a deliberate one on your part and these conditions are not met, rethrowing or catching the resulting InvalidOperationException is appropriate. En caso contrario, o si espera que las condiciones no válidas se alcanzará con cierta frecuencia, considere la posibilidad de utilizar algún otro Enumerable método, como FirstOrDefault o Where.Otherwise, or if you expect that invalid conditions will occur with some frequency, you should consider using some other Enumerable method, such as FirstOrDefault or Where.

Acceso de campo dinámico entre dominios de aplicaciónDynamic cross-application domain field access

El OpCodes.Ldflda produce la instrucción del lenguaje intermedio (MSIL) de Microsoft un InvalidOperationException excepción si el objeto que contiene el campo cuya dirección se intenta recuperar no está dentro del dominio de aplicación en el que se está ejecutando el código.The OpCodes.Ldflda Microsoft intermediate language (MSIL) instruction throws an InvalidOperationException exception if the object containing the field whose address you are trying to retrieve is not within the application domain in which your code is executing. La dirección de un campo solo se puede acceder desde el dominio de aplicación en el que reside.The address of a field can only be accessed from the application domain in which it resides.

Producir una excepción InvalidOperationExceptionThrowing an InvalidOperationException exception

Debe producir una InvalidOperationException excepción solo cuando el estado del objeto por alguna razón no es compatible con una llamada de método concreto.You should throw an InvalidOperationException exception only when the state of your object for some reason does not support a particular method call. Es decir, la llamada al método es válida en algunas circunstancias o contextos, pero no es válido en otros.That is, the method call is valid in some circumstances or contexts, but is invalid in others.

Si el error de invocación de método es argumentos no válidos, a continuación, ArgumentException o uno de sus clases derivadas, ArgumentNullException o ArgumentOutOfRangeException, debería ser iniciado en su lugar.If the method invocation failure is due to invalid arguments, then ArgumentException or one of its derived classes, ArgumentNullException or ArgumentOutOfRangeException, should be thrown instead.

Información diversaMiscellaneous information

InvalidOperationException utiliza COR_E_INVALIDOPERATION HRESULT, que tiene el valor 0 x 80131509.InvalidOperationException uses the HRESULT COR_E_INVALIDOPERATION, which has the value 0x80131509.

Para obtener una lista de valores de propiedad iniciales de una instancia de InvalidOperationException, consulte el InvalidOperationException constructores.For a list of initial property values for an instance of InvalidOperationException, see the InvalidOperationException constructors.

Constructores

InvalidOperationException() InvalidOperationException() InvalidOperationException() InvalidOperationException()

Inicializa una nueva instancia de la clase InvalidOperationException.Initializes a new instance of the InvalidOperationException class.

InvalidOperationException(SerializationInfo, StreamingContext) InvalidOperationException(SerializationInfo, StreamingContext) InvalidOperationException(SerializationInfo, StreamingContext) InvalidOperationException(SerializationInfo, StreamingContext)

Inicializa una nueva instancia de la clase InvalidOperationException con datos serializados.Initializes a new instance of the InvalidOperationException class with serialized data.

InvalidOperationException(String) InvalidOperationException(String) InvalidOperationException(String) InvalidOperationException(String)

Inicializa una nueva instancia de la clase InvalidOperationException con el mensaje de error especificado.Initializes a new instance of the InvalidOperationException class with a specified error message.

InvalidOperationException(String, Exception) InvalidOperationException(String, Exception) InvalidOperationException(String, Exception) InvalidOperationException(String, Exception)

Inicializa una nueva instancia de la clase InvalidOperationException con el mensaje de error especificado y una referencia a la excepción interna que representa la causa de esta excepción.Initializes a new instance of the InvalidOperationException class with a specified error message and a reference to the inner exception that is the cause of this exception.

Propiedades

Data Data Data Data

Obtiene una colección de pares clave-valor que proporcionan más información definida por el usuario sobre la excepción.Gets a collection of key/value pairs that provide additional user-defined information about the exception.

(Inherited from Exception)
HelpLink HelpLink HelpLink HelpLink

Obtiene o establece un vínculo al archivo de ayuda asociado a esta excepción.Gets or sets a link to the help file associated with this exception.

(Inherited from Exception)
HResult HResult HResult HResult

Obtiene o establece HRESULT, un valor numérico codificado que se asigna a una excepción específica.Gets or sets HRESULT, a coded numerical value that is assigned to a specific exception.

(Inherited from Exception)
InnerException InnerException InnerException InnerException

Obtiene la instancia Exception que produjo la excepción actual.Gets the Exception instance that caused the current exception.

(Inherited from Exception)
Message Message Message Message

Obtiene un mensaje que describe la excepción actual.Gets a message that describes the current exception.

(Inherited from Exception)
Source Source Source Source

Devuelve o establece el nombre de la aplicación o del objeto que generó el error.Gets or sets the name of the application or the object that causes the error.

(Inherited from Exception)
StackTrace StackTrace StackTrace StackTrace

Obtiene una representación de cadena de los marcos inmediatos en la pila de llamadas.Gets a string representation of the immediate frames on the call stack.

(Inherited from Exception)
TargetSite TargetSite TargetSite TargetSite

Obtiene el método que produjo la excepción actual.Gets the method that throws the current exception.

(Inherited from Exception)

Métodos

Equals(Object) Equals(Object) Equals(Object) Equals(Object)

Determina si el objeto especificado es igual al objeto actual.Determines whether the specified object is equal to the current object.

(Inherited from Object)
GetBaseException() GetBaseException() GetBaseException() GetBaseException()

Cuando se reemplaza en una clase derivada, devuelve la clase Exception que representa la causa principal de una o más excepciones posteriores.When overridden in a derived class, returns the Exception that is the root cause of one or more subsequent exceptions.

(Inherited from Exception)
GetHashCode() GetHashCode() GetHashCode() GetHashCode()

Sirve como la función hash predeterminada.Serves as the default hash function.

(Inherited from Object)
GetObjectData(SerializationInfo, StreamingContext) GetObjectData(SerializationInfo, StreamingContext) GetObjectData(SerializationInfo, StreamingContext) GetObjectData(SerializationInfo, StreamingContext)

Cuando se reemplaza en una clase derivada, establece SerializationInfo con información sobre la excepción.When overridden in a derived class, sets the SerializationInfo with information about the exception.

(Inherited from Exception)
GetType() GetType() GetType() GetType()

Obtiene el tipo de tiempo de ejecución de la instancia actual.Gets the runtime type of the current instance.

(Inherited from Exception)
MemberwiseClone() MemberwiseClone() MemberwiseClone() MemberwiseClone()

Crea una copia superficial del Object actual.Creates a shallow copy of the current Object.

(Inherited from Object)
ToString() ToString() ToString() ToString()

Crea y devuelve una representación de cadena de la excepción actual.Creates and returns a string representation of the current exception.

(Inherited from Exception)

Eventos

SerializeObjectState SerializeObjectState SerializeObjectState SerializeObjectState

Ocurre cuando una excepción se serializa para crear un objeto de estado de excepción que contenga datos serializados sobre la excepción.Occurs when an exception is serialized to create an exception state object that contains serialized data about the exception.

(Inherited from Exception)

Se aplica a

Consulte también: