InvalidOperationException InvalidOperationException InvalidOperationException InvalidOperationException Class

定義

オブジェクトの現在の状態に対して無効なメソッド呼び出しが行われた場合にスローされる例外。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
継承
InvalidOperationExceptionInvalidOperationExceptionInvalidOperationExceptionInvalidOperationException
派生
属性

注釈

InvalidOperationExceptionは、メソッドを呼び出すことができなかった場合に、無効な引数以外の理由によって発生します。InvalidOperationException is used in cases when the failure to invoke a method is caused by reasons other than invalid arguments. 通常は、オブジェクトの状態がメソッド呼び出しをサポートできない場合にスローされます。Typically, it is thrown when the state of an object cannot support the method call. たとえば、 InvalidOperationException次のようなメソッドによって例外がスローされます。For example, an InvalidOperationException exception is thrown by methods such as:

  • IEnumerator.MoveNext列挙子の作成後にコレクションのオブジェクトを変更する場合はです。IEnumerator.MoveNext if objects of a collection are modified after the enumerator is created. 詳細については、「コレクションの反復処理中の変更」を参照してください。For more information, see Changing a collection while iterating it.

  • ResourceSet.GetStringメソッド呼び出しが行われる前にリソースセットが閉じられている場合は。ResourceSet.GetString if the resource set is closed before the method call is made.

  • XContainer.Addを指定すると、追加するオブジェクトが不適切に構造化された XML ドキュメントになります。XContainer.Add, if the object or objects to be added would result in an incorrectly structured XML document.

  • メインまたは UI スレッドではないスレッドから UI を操作しようとするメソッド。A method that attempts to manipulate the UI from a thread that is not the main or UI thread.

重要

この例外はさまざまな状況でスローされる可能性があるため、 Messageプロパティによって返される例外メッセージを読み取ることが重要です。 InvalidOperationExceptionBecause 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.

このセクションの内容:In this section:

InvalidOperationException 例外の一般的な原因 Some common causes of InvalidOperationException exceptions
Ui 以外のスレッドから UI スレッドを更新するUpdating a UI thread from a non-UI thread
反復処理中のコレクションの変更Changing a collection while iterating it
オブジェクトを比較できない配列またはコレクションの並べ替えSorting an array or collection whose objects cannot be compared
Null である<null>許容の T を基になる型にキャストしています Casting a Nullable<T> that is null to its underlying type
空のコレクションでの system.string メソッドの呼び出しCalling a System.Linq.Enumerable method on an empty collection
1つの要素を含まないシーケンスで列挙可能な単一または SingleOrDefault を呼び出すCalling Enumerable.Single or Enumerable.SingleOrDefault on a sequence without one element
動的なクロスアプリケーションドメインフィールドアクセスDynamic cross-application domain field access
InvalidOperationException 例外のスローThrowing an InvalidOperationException exception
その他の情報Miscellaneous information

InvalidOperationException 例外の一般的な原因Some common causes of InvalidOperationException exceptions

次のセクションでは、アプリでInvalidOperationException例外がスローされる一般的なケースについて説明します。The following sections show how some common cases in which in InvalidOperationException exception is thrown in an app. この問題をどのように処理するかは、特定の状況によって異なります。How you handle the issue depends on the specific situation. ただし、ほとんどの場合、例外は開発者エラーにInvalidOperationExceptionよって発生するので、例外を予測して回避することができます。Most commonly, however, the exception results from developer error, and the InvalidOperationException exception can be anticipated and avoided.

Ui 以外のスレッドから UI スレッドを更新するUpdating a UI thread from a non-UI thread

多くの場合、ワーカースレッドを使用して、アプリケーションのユーザーインターフェイスに表示されるデータの収集を含むバックグラウンド作業を実行します。Often, worker threads are used to perform some background work that involves gathering data to be displayed in an application's user interface. ただし.However. .NET Framework 用のほとんどの GUI (グラフィカルユーザーインターフェイス) アプリケーションフレームワーク (Windows フォーム、Windows Presentation Foundation (WPF) など) を使用すると、UI を作成および管理するスレッド (メインまたは UI スレッド) からのみ、GUI オブジェクトにアクセスできます。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). Ui InvalidOperationExceptionスレッド以外のスレッドから ui 要素にアクセスしようとすると、がスローされます。An InvalidOperationException is thrown when you try to access a UI element from a thread other than the UI thread. 例外メッセージのテキストを次の表に示します。The text of the exception message is shown in the following table.

アプリケーションの種類Application Type メッセージMessage
WPF アプリWPF app 別のスレッドが所有しているため、呼び出し元のスレッドはこのオブジェクトにアクセスできません。The calling thread cannot access this object because a different thread owns it.
UWP アプリUWP app アプリケーションが、別のスレッドにマーシャリングされたインターフェイスを呼び出しました。The application called an interface that was marshaled for a different thread.
Windows フォームアプリWindows Forms app スレッド間の操作が無効です:コントロールが作成されたスレッド以外のスレッドから、コントロール ' TextBox1 ' がアクセスされました。Cross-thread operation not valid: Control 'TextBox1' accessed from a thread other than the thread it was created on.

.NET Framework の UI フレームワークは、ui 要素のメンバーへの呼び出しが UI スレッドで実行されているかどうかを確認するメソッドと、UI スレッドでの呼び出しをスケジュールするその他のメソッドを含む、ディスパッチャーパターンを実装します。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:

  • WPF アプリでDispatcher.CheckAccessメソッドを呼び出して、UI 以外のスレッドでメソッドが実行されているかどうかを確認します。In WPF apps, call the Dispatcher.CheckAccess method to determine if a method is running on a non-UI thread. メソッドがtrue UI falseスレッドで実行されている場合はを返し、それ以外の場合はを返します。It returns true if the method is running on the UI thread and false otherwise. UI スレッドで呼び出しをスケジュールするDispatcher.Invokeには、メソッドのいずれかのオーバーロードを呼び出します。Call one of the overloads of the Dispatcher.Invoke method to schedule the call on the UI thread.

  • UWP アプリで、 CoreDispatcherメソッドを呼び出して、UI 以外のスレッドでメソッドが実行されているかどうかを確認します。In UWP apps, call the CoreDispatcher.HasThreadAccess method to determine if a method is running on a non-UI thread. CoreDispatcherメソッドを呼び出して、UI スレッドを更新するデリゲートを実行します。Call the CoreDispatcher.RunAsync method to execute a delegate that updates the UI thread. Use the

  • Windows フォームアプリで、 Control.InvokeRequiredプロパティを使用して、メソッドが非 UI スレッドで実行されているかどうかを確認します。In Windows Forms apps, use the Control.InvokeRequired property to determine if a method is running on a non-UI thread. Control.Invokeメソッドのオーバーロードの1つを呼び出して、UI スレッドを更新するデリゲートを実行します。Call one of the overloads of the Control.Invoke method to execute a delegate that updates the UI thread.

次の例は、 InvalidOperationException作成したスレッド以外のスレッドから UI 要素を更新しようとしたときにスローされる例外を示しています。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. 各例では、次の2つのコントロールを作成する必要があります。Each example requires that you create two controls:

  • という名前textBox1のテキストボックスコントロール。A text box control named textBox1. Windows フォームアプリでは、 Multilineプロパティをにtrue設定する必要があります。In a Windows Forms app, you should set its Multiline property to true.

  • という名前threadExampleBtnのボタンコントロール。A button control named threadExampleBtn. この例では、ボタンThreadsExampleBtn_ClickClickイベントのハンドラーを提供しています。The example provides a handler, ThreadsExampleBtn_Click, for the button's Click event.

どちらの場合も、 threadExampleBtn_ClickイベントハンドラーはDoSomeWorkメソッドを2回呼び出します。In each case, the threadExampleBtn_Click event handler calls the DoSomeWork method twice. 最初の呼び出しは同期的に実行され、成功します。The first call runs synchronously and succeeds. ただし、2回目の呼び出しは、スレッドプールのスレッドで非同期的に実行されるので、UI 以外のスレッドから UI を更新しようとします。But the second call, because it runs asynchronously on a thread pool thread, attempts to update the UI from a non-UI thread. この結果、例外InvalidOperationExceptionが発生します。This results in a InvalidOperationException exception.

WPF と UWP アプリWPF 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

次のバージョンDoSomeWorkのメソッドでは、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

次のバージョンDoSomeWorkのメソッドは、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

Windows フォーム アプリWindows 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

次のバージョンDoSomeWorkのメソッドでは、Windows フォームアプリで例外が除去されます。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

反復処理中のコレクションの変更Changing a collection while iterating it

Visual Basic 内のC# For Eachステートメントまたはステートメント内のステートメントは、コレクションのメンバーを反復処理し、個々の要素を読み取りまたは変更するために使用されますforeachThe 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. ただし、コレクションの項目を追加または削除するために使用することはできません。However, it can't be used to add or remove items from the collection. これを行うとInvalidOperationException 、"コレクションが変更されました。" のようなメッセージが表示され、例外がスローされます。列挙操作を実行できない可能性があります。"Doing this throws an InvalidOperationException exception with a message that is similar to, "Collection was modified; enumeration operation may not execute."

次の例では、整数の集合を反復処理して、各整数の2乗をコレクションに追加します。The following example iterates a collection of integers attempts to add the square of each integer to the collection. この例ではInvalidOperationException 、メソッドのList<T>.Add最初の呼び出しを使用してをスローします。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()

アプリケーションロジックに応じて、次の2つの方法のいずれかで例外を除去できます。You can eliminate the exception in one of two ways, depending on your application logic:

  • 反復処理中にコレクションに要素を追加する必要がある場合for foreachは、またはでは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. 次の例では、for ステートメントを使用して、コレクション内の数値の2乗をコレクションに追加します。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
    

    反復処理の回数を設定する必要があることに注意してください。ループ内のカウンターを使用して、ループを適切に終了するにCountは、前に繰り返すか、-1 から0を反復処理します。配列内の要素のうち、変数を使用し、それを使用してループの上限を設定します。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. それ以外の場合、反復処理のたびに要素がコレクションに追加されると、無限ループが発生します。Otherwise, if an element is added to the collection on every iteration, an endless loop results.

  • 反復処理中にコレクションに要素を追加する必要がない場合は、コレクションの反復処理が終了したときに追加する一時コレクションに追加する要素を格納できます。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. 次の例では、この方法を使用してコレクション内の数値の2乗を一時コレクションに追加し、コレクションを1つの配列オブジェクトに結合します。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
    

オブジェクトを比較できない配列またはコレクションの並べ替えSorting an array or collection whose objects cannot be compared

Array.Sort(Array)メソッドIComparable<T> IComparableやメソッドなどの汎用的な並べ替え方法では、通常、並べ替えの対象となるオブジェクトの少なくとも1つが、インターフェイスまたはインターフェイスを実装する必要があります。 List<T>.Sort()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. それ以外の場合、コレクションまたは配列は並べ替えられず、メソッドInvalidOperationExceptionは例外をスローします。If not, the collection or array cannot be sorted, and the method throws an InvalidOperationException exception. 次の例ではPerson 、クラスを定義Personし、2つList<T>のオブジェクトをジェネリックオブジェクトに格納して、並べ替えを試みます。The following example defines a Person class, stores two Person objects in a generic List<T> object, and attempts to sort them. この例の出力が示すように、 List<T>.Sort()メソッドを呼び出すと、が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()

例外は、次の3つの方法のいずれかで排除できます。You can eliminate the exception in any of three ways:

  • 並べ替えようとしている型を所有できる場合 (つまり、ソースコードを制御する場合)、 IComparable<T> IComparableまたはインターフェイスを実装するように変更できます。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. これを行うにIComparable<T>.CompareTo CompareToは、メソッドまたはメソッドのいずれかを実装する必要があります。This requires that you implement either the IComparable<T>.CompareTo or the CompareTo method. 既存の型にインターフェイス実装を追加することは、互換性に影響する変更点ではありません。Adding an interface implementation to an existing type is not a breaking change.

    次の例では、この方法をIComparable<T>使用してPerson 、クラスの実装を提供しています。The following example uses this approach to provide an IComparable<T> implementation for the Person class. コレクションまたは配列の一般的な並べ替えメソッドを呼び出すこともできます。この例の出力に示されているように、コレクションは正常に並べ替えられます。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
    
  • 並べ替えようとしている型のソースコードを変更できない場合は、 IComparer<T>インターフェイスを実装する特別な目的の並べ替えクラスを定義できます。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. パラメーターIComparer<T>を含むSortメソッドのオーバーロードを呼び出すことができます。You can call an overload of the Sort method that includes an IComparer<T> parameter. この方法は、複数の条件に基づいてオブジェクトを並べ替えることができる特殊な並べ替えクラスを開発する場合に特に便利です。This approach is especially useful if you want to develop a specialized sorting class that can sort objects based on multiple criteria.

    次の例では、コレクションの並べ替えPersonComparer Personに使用されるカスタムクラスを開発することによって、アプローチを使用します。The following example uses the approach by developing a custom PersonComparer class that is used to sort Person collections. 次に、このクラスのインスタンスをList<T>.Sort(IComparer<T>)メソッドに渡します。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
    
  • 並べ替えようとしている型のソースコードを変更できない場合は、並べ替えを実行Comparison<T>するデリゲートを作成できます。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. デリゲートシグネチャはです。The delegate signature is

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

    次の例では、 PersonComparison Comparison<T>デリゲートシグネチャと一致するメソッドを定義することによって、アプローチを使用します。The following example uses the approach by defining a PersonComparison method that matches the Comparison<T> delegate signature. 次に、このデリゲートをList<T>.Sort(Comparison<T>)メソッドに渡します。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
    

Null である<null 許容型 > を基になる型にキャストしていますCasting a Nullable<T> that is null to its underlying type

基になる型Nullable<T> nullに値をキャストしようとすると、 InvalidOperationException例外がスローされ、"null 許容のオブジェクトには値が必要です" というエラーメッセージが表示されます。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.

次の例ではInvalidOperationException 、値をNullable(Of Integer)含む配列を反復処理しようとすると、例外がスローされます。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()

例外を回避するには、次のようにします。To prevent the exception:

次の例では、両方とInvalidOperationExceptionも例外を回避します。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

空のコレクションでの system.string メソッドの呼び出しCalling a System.Linq.Enumerable method on an empty collection

Enumerable.AggregateEnumerable.Average、 、Enumerable.Last、 、Enumerable.Max、、およびのEnumerable.SingleOrDefault各メソッドは、シーケンスに対して操作を実行し、1つの結果を返します。 Enumerable.Min Enumerable.First Enumerable.SingleThe 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. これらのメソッドの一部のオーバーロードInvalidOperationExceptionは、シーケンスが空の場合に例外をスロー nullし、他のオーバーロードはを返します。Some overloads of these methods throw an InvalidOperationException exception when the sequence is empty, while other overloads return null. またEnumerable.SingleOrDefault 、このメソッドはInvalidOperationException 、シーケンスに複数の要素が含まれている場合にも例外をスローします。The Enumerable.SingleOrDefault method also throws an InvalidOperationException exception when the sequence contains more than one element.

注意

InvalidOperationException例外をスローするメソッドのほとんどはオーバーロードです。Most of the methods that throw an InvalidOperationException exception are overloads. 選択したオーバーロードの動作を理解していることを確認してください。Be sure that you understand the behavior of the overload that you choose.

次の表に、いくつかInvalidOperationException System.Linq.Enumerableのメソッドの呼び出しによってスローされる例外オブジェクトからの例外メッセージの一覧を示します。The following table lists the exception messages from the InvalidOperationException exception objects thrown by calls to some System.Linq.Enumerable methods.

メソッドMethod メッセージMessage
Aggregate
Average
Last
Max
Min
シーケンスに要素が含まれていませんSequence contains no elements
First シーケンスに一致する要素が含まれていませんSequence contains no matching element
Single
SingleOrDefault
シーケンスに複数の一致する要素が含まれていますSequence contains more than one matching element

例外を除去または処理する方法は、アプリケーションの前提条件と、呼び出す特定の方法によって異なります。How you eliminate or handle the exception depends on your application's assumptions and on the particular method you call.

  • 空のシーケンスを確認せずにこれらのメソッドのいずれかを意図的に呼び出した場合は、シーケンスが空ではなく、空のシーケンスが予期しない状態になることを前提としています。When you deliberately call one of these methods without checking for an empty sequence, you are assuming that the sequence is not empty, and that an empty sequence is an unexpected occurrence. この場合、例外をキャッチまたは再スローするのが適切です。In this case, catching or rethrowing the exception is appropriate .

  • 空のシーケンスのチェックに失敗した場合は、 Enumerable.Anyオーバーロードのいずれかのオーバーロードを呼び出して、シーケンスに要素が含まれているかどうかを判断できます。If your failure to check for an empty sequence was inadvertent, you can call one of the overloads of the Enumerable.Any overload to determine whether a sequence contains any elements.

    ヒント

    シーケンスをEnumerable.Any<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>)生成する前にメソッドを呼び出すと、処理されるデータに多数の要素が含まれている場合や、シーケンスを生成する操作の負荷が高い場合に、パフォーマンスが向上します。Calling the Enumerable.Any<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) method before generating a sequence can improve performance if the data to be processed might contain a large number of elements or if operation that generates the sequence is expensive.

  • Enumerable.First Enumerable.FirstOrDefault Enumerable.LastOrDefault Enumerable.SingleOrDefault、、またはEnumerable.Singleなどのメソッドを呼び出した場合は、シーケンスのメンバーではなく既定値を返す、、などの別のメソッドを置き換えることができます。 Enumerable.LastIf you've called a method such as Enumerable.First, Enumerable.Last, or Enumerable.Single, you can substitute an alternate method, such as Enumerable.FirstOrDefault, Enumerable.LastOrDefault, or Enumerable.SingleOrDefault, that returns a default value instead of a member of the sequence.

これらの例では、追加の詳細情報を提供します。The examples provide additional detail.

次の例ではEnumerable.Average 、メソッドを使用して、値が4より大きいシーケンスの平均を計算します。The following example uses the Enumerable.Average method to compute the average of a sequence whose values are greater than 4. 元の配列の値が4を超えることはないため、シーケンスに値は含まれず、メソッドInvalidOperationExceptionは例外をスローします。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()

次の例に示すように、 Anyメソッドを呼び出して、シーケンスを処理するメソッドを呼び出す前に、シーケンスに要素が含まれているかどうかを判断することにより、例外を排除できます。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.

Enumerable.Firstメソッドは、シーケンス内の最初の項目、または指定された条件を満たすシーケンス内の最初の要素を返します。The Enumerable.First method returns the first item in a sequence or the first element in a sequence that satisfies a specified condition. シーケンスが空であるために最初の要素がない場合は、 InvalidOperationException例外がスローされます。If the sequence is empty and therefore does not have a first element, it throws an InvalidOperationException exception.

次の例では、 Enumerable.First<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) dbQueryResults 配列にInvalidOperationException 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()

Enumerable.FirstOrDefaultEnumerable.First代わりにメソッドを呼び出して、指定された値または既定値を返すことができます。You can call the Enumerable.FirstOrDefault method instead of Enumerable.First to return a specified or default value. メソッドがシーケンス内の最初の要素を見つけられない場合は、そのデータ型の既定値を返します。If the method does not find a first element in the sequence, it returns the default value for that data type. 既定値は、 null参照型の場合は0、数値データ型DateTime.MinValue DateTimeの場合は0、型の場合はです。The default value is null for a reference type, zero for a numeric data type, and DateTime.MinValue for the DateTime type.

注意

Enumerable.FirstOrDefaultメソッドによって返される値を解釈することは、多くの場合、型の既定値がシーケンス内の有効な値であるという事実によって複雑になります。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. この場合は、メソッドを呼び出しEnumerable.Anyて、 Enumerable.Firstメソッドを呼び出す前に、シーケンスに有効なメンバーがあるかどうかを確認します。In this case, you an call the Enumerable.Any method to determine whether the sequence has valid members before calling the Enumerable.First method.

次の例ではEnumerable.FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) 、メソッドを呼び出しInvalidOperationExceptionて、前の例で例外がスローされないようにしています。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.

1つの要素を含まないシーケンスで列挙可能な単一または SingleOrDefault を呼び出すCalling Enumerable.Single or Enumerable.SingleOrDefault on a sequence without one element

Enumerable.Singleメソッドは、シーケンスの唯一の要素、または指定された条件を満たすシーケンスの唯一の要素を返します。The Enumerable.Single method returns the only element of a sequence, or the only element of a sequence that meets a specified condition. シーケンス内に要素が存在しない場合、または複数の要素が存在する場合、メソッドはInvalidOperationException例外をスローします。If there are no elements in the sequence, or if there is more than one element , the method throws an InvalidOperationException exception.

シーケンスに要素がEnumerable.SingleOrDefault含まれていない場合に例外をスローする代わりに、メソッドを使用して既定値を返すことができます。You can use the Enumerable.SingleOrDefault method to return a default value instead of throwing an exception when the sequence contains no elements. ただし、シーケンスEnumerable.SingleOrDefaultに複数の要素InvalidOperationExceptionが含まれている場合、メソッドは依然として例外をスローします。However, the Enumerable.SingleOrDefault method still throws an InvalidOperationException exception when the sequence contains more than one element.

次の表は、メソッドおよびInvalidOperationException Enumerable.SingleOrDefaultメソッドのEnumerable.Single呼び出しによってスローされた例外オブジェクトからの例外メッセージの一覧です。The following table lists the exception messages from the InvalidOperationException exception objects thrown by calls to the Enumerable.Single and Enumerable.SingleOrDefault methods.

メソッドMethod メッセージMessage
Single シーケンスに一致する要素が含まれていませんSequence contains no matching element
Single
SingleOrDefault
シーケンスに複数の一致する要素が含まれていますSequence contains more than one matching element

次の例では、シーケンスに 4 Enumerable.Singleより大きい要素InvalidOperationExceptionが含まれていないため、メソッドの呼び出しで例外がスローされます。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()

次の例では、 InvalidOperationException Enumerable.SingleOrDefaultメソッドを呼び出す代わりに、シーケンスが空の場合にスローされる例外を回避しようとしています。The following example attempts to prevent the InvalidOperationException exception thrown when a sequence is empty by instead calling the Enumerable.SingleOrDefault method. ただし、このシーケンスは2より大きい値を持つ複数の要素を返すため、 InvalidOperationException例外もスローします。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()

Enumerable.Singleメソッドを呼び出すと、指定した条件を満たすシーケンスまたはシーケンスに含まれる要素が1つだけであることが前提となります。Calling the Enumerable.Single method assumes that either a sequence or the sequence that meets specified criteria contains only one element. Enumerable.SingleOrDefault0個または1個の結果を持つシーケンスを想定していますが、これ以上はありません。Enumerable.SingleOrDefault assumes a sequence with zero or one result, but no more. この想定が自分のパーツに意図的に作成されていて、これらの条件が満たされInvalidOperationExceptionていない場合は、結果のを再スローまたはキャッチすることが適切です。If this assumption is a deliberate one on your part and these conditions are not met, rethrowing or catching the resulting InvalidOperationException is appropriate. それ以外の場合、または何らかの頻度で無効な条件が発生すると予想さEnumerableれる場合は、 FirstOrDefaultWhereなどの他の方法を使用することを検討してください。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.

動的なクロスアプリケーションドメインフィールドアクセスDynamic cross-application domain field access

取得しようとしているアドレスがコードInvalidOperationExceptionを実行しているアプリケーションドメイン内にない場合、 Microsoft中間言語(MSIL)命令は例外をスローします。OpCodes.LdfldaThe 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. フィールドのアドレスには、そのフィールドが存在するアプリケーションドメインからのみアクセスできます。The address of a field can only be accessed from the application domain in which it resides.

InvalidOperationException 例外のスローThrowing an InvalidOperationException exception

何らかの理由InvalidOperationExceptionでオブジェクトの状態が特定のメソッド呼び出しをサポートしていない場合にのみ、例外をスローする必要があります。You should throw an InvalidOperationException exception only when the state of your object for some reason does not support a particular method call. つまり、メソッドの呼び出しは、状況やコンテキストによっては有効ですが、他の方法では無効です。That is, the method call is valid in some circumstances or contexts, but is invalid in others.

メソッドの呼び出しエラーが無効な引数でArgumentExceptionある場合、またはその派生ArgumentNullExceptionクラス (またはArgumentOutOfRangeException) のいずれかを代わりにスローする必要があります。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.

その他の情報Miscellaneous information

InvalidOperationExceptionでは、値 0x8013150 9 を持つ HRESULT COR_E_INVALIDOPERATION が使用されます。InvalidOperationException uses the HRESULT COR_E_INVALIDOPERATION, which has the value 0x80131509.

InvalidOperationExceptionインスタンスの初期プロパティ値の一覧については、InvalidOperationExceptionコンストラクターを参照してください。For a list of initial property values for an instance of InvalidOperationException, see the InvalidOperationException constructors.

コンストラクター

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

InvalidOperationException クラスの新しいインスタンスを初期化します。Initializes a new instance of the InvalidOperationException class.

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

シリアル化したデータを使用して、InvalidOperationException クラスの新しいインスタンスを初期化します。Initializes a new instance of the InvalidOperationException class with serialized data.

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

指定したエラー メッセージを使用して、InvalidOperationException クラスの新しいインスタンスを初期化します。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)

指定したエラー メッセージおよびこの例外の原因となった内部例外への参照を使用して、InvalidOperationException クラスの新しいインスタンスを初期化します。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.

プロパティ

Data Data Data Data

例外に関する追加のユーザー定義情報を提供する、キー/値ペアのコレクションを取得します。Gets a collection of key/value pairs that provide additional user-defined information about the exception.

(Inherited from Exception)
HelpLink HelpLink HelpLink HelpLink

この例外に関連付けられているヘルプ ファイルへのリンクを取得または設定します。Gets or sets a link to the help file associated with this exception.

(Inherited from Exception)
HResult HResult HResult HResult

特定の例外に割り当てられているコード化数値である HRESULT を取得または設定します。Gets or sets HRESULT, a coded numerical value that is assigned to a specific exception.

(Inherited from Exception)
InnerException InnerException InnerException InnerException

現在の例外の原因となる Exception インスタンスを取得します。Gets the Exception instance that caused the current exception.

(Inherited from Exception)
Message Message Message Message

現在の例外を説明するメッセージを取得します。Gets a message that describes the current exception.

(Inherited from Exception)
Source Source Source Source

エラーの原因となるアプリケーションまたはオブジェクトの名前を取得または設定します。Gets or sets the name of the application or the object that causes the error.

(Inherited from Exception)
StackTrace StackTrace StackTrace StackTrace

呼び出し履歴で直前のフレームの文字列形式を取得します。Gets a string representation of the immediate frames on the call stack.

(Inherited from Exception)
TargetSite TargetSite TargetSite TargetSite

現在の例外がスローされたメソッドを取得します。Gets the method that throws the current exception.

(Inherited from Exception)

メソッド

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

指定したオブジェクトが、現在のオブジェクトと等しいかどうかを判断します。Determines whether the specified object is equal to the current object.

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

派生クラスでオーバーライドされた場合、それ以後に発生する 1 つ以上の例外の主要な原因である Exception を返します。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()

既定のハッシュ関数として機能します。Serves as the default hash function.

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

派生クラスでオーバーライドされた場合は、その例外に関する情報を使用して SerializationInfo を設定します。When overridden in a derived class, sets the SerializationInfo with information about the exception.

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

現在のインスタンスのランタイム型を取得します。Gets the runtime type of the current instance.

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

現在の Object の簡易コピーを作成します。Creates a shallow copy of the current Object.

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

現在の例外の文字列形式を作成して返します。Creates and returns a string representation of the current exception.

(Inherited from Exception)

イベント

SerializeObjectState SerializeObjectState SerializeObjectState SerializeObjectState

例外がシリアル化され、例外に関するシリアル化されたデータを含む例外状態オブジェクトが作成されたときに発生します。Occurs when an exception is serialized to create an exception state object that contains serialized data about the exception.

(Inherited from Exception)

適用対象

こちらもご覧ください