InvalidOperationException Class

定義

オブジェクトの現在の状態に対して無効なメソッド呼び出しが行われた場合にスローされる例外。 The exception that is thrown when a method call is invalid for the object's current state.

[System.Runtime.InteropServices.ComVisible(true)]
public class InvalidOperationException : SystemException
継承
InvalidOperationException
派生
属性

注釈

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.

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

重要

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

このセクションの内容: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
キャスト Nullable<T>基になる型に null です Casting a Nullable<T> that is null to its underlying type
空のコレクションに対して System.Linq.Enumerable メソッドを呼び出すCalling a System.Linq.Enumerable method on an empty collection
1 つの要素のないシーケンスで Enumerable.Single または Enumerable.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. Windows フォームや Windows Presentation Foundation (WPF) など、.NET Framework のほとんどの GUI (グラフィカル ユーザー インターフェイス) アプリケーション フレームワークを使用する 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). InvalidOperationException UI スレッド以外のスレッドから 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 marshalled 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. オーバー ロードの 1 つを呼び出して、Dispatcher.Invokeメソッド、UI スレッドで呼び出しをスケジュールします。Call one of the overloads of the Dispatcher.Invoke method to schedule the call on the UI thread.

  • UWP アプリを呼び出して、 CoreDispatcher.HasThreadAccessメソッドが UI 以外のスレッドで実行されているかどうかを判断するメソッド。In UWP apps, call the CoreDispatcher.HasThreadAccess method to determine if a method is running on a non-UI thread. 呼び出す、 CoreDispatcher.RunAsyncメソッドを 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. オーバー ロードの 1 つを呼び出して、Control.Invokeメソッドを 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_Click、ボタンのClickイベント。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

foreach (C#) ステートメントまたはFor Eachコレクションのメンバーを反復処理と、読み取り、またはその個々 の要素を変更する Visual Basic でのステートメントを使用します。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. ただし、追加またはコレクションから項目を削除する使用できません。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. 次の例では、コレクションにコレクションの数の 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
    

    メモのいずれかを終了前に、反復処理するループ appropraitely、ループ内でカウンターを使用して、コレクションを反復処理する前にイテレーションの数を確立する必要がありますから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 appropraitely, 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)メソッドまたはList<T>.Sort()メソッド、通常必要とする少なくとも 1 つの並べ替えの基準オブジェクトを実装、IComparable<T>またはIComparableインターフェイス。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クラス、2 つのストアPersonを汎用オブジェクト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. オーバー ロードを呼び出すことができます、Sortメソッドを含む、IComparer<T>パラメーター。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
    

キャスト Nullable<T > を基になる型は 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.Linq.Enumerable メソッドを呼び出すCalling a System.Linq.Enumerable method on an empty collection

Enumerable.AggregateEnumerable.AverageEnumerable.FirstEnumerable.LastEnumerable.MaxEnumerable.MinEnumerable.Single、およびEnumerable.SingleOrDefaultメソッドは、シーケンスに対して操作を実行を 1 つの結果を返します。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. これらのメソッドの一部のオーバー ロードのスロー、InvalidOperationExceptionシーケンスが空で、他のオーバー ロードを返す場合に例外nullします。Some overloads of these methods throw an InvalidOperationException exception when the sequence is empty, while other overloads return null. Enumerable.SingleOrDefaultもメソッドがスローされます、InvalidOperationExceptionシーケンスには、1 つ以上の要素が含まれている場合は例外です。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
シーケンスには、1 つ以上の一致する要素が含まれています。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.FirstEnumerable.Last、またはEnumerable.Singleなど、別の方法を置き換えることができるEnumerable.FirstOrDefaultEnumerable.LastOrDefault、またはEnumerable.SingleOrDefaultシーケンスのメンバーではなく、既定値を返します。If 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>)メソッドがスローされます、InvalidOperationException例外 dbQueryResults 配列が 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.FirstOrDefaultメソッドの代わりにEnumerable.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.MinValueDateTime型。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 つの要素のないシーケンスで Enumerable.Single または Enumerable.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. シーケンスの要素がないかどうか、または 1 つ以上の要素がある場合、メソッドがスローされます、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シーケンスには、1 つ以上の要素が含まれている場合は例外です。However, the Enumerable.SingleOrDefault method still throws an InvalidOperationException exception when the sequence contains more than one element.

次の表からの例外メッセージ、InvalidOperationExceptionへの呼び出しによってスローされた例外オブジェクト、Enumerable.SingleEnumerable.SingleOrDefaultメソッド。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
シーケンスには、1 つ以上の一致する要素が含まれています。Sequence contains more than one matching element

次の例への呼び出しで、Enumerable.Singleメソッドがスローされます、InvalidOperationException例外、シーケンスは 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()

次の例の試行を防ぐために、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.SingleOrDefault 0 個または 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メソッドなどFirstOrDefaultまたは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.

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

OpCodes.Ldflda Microsoft intermediate language (MSIL) 命令のスロー、InvalidOperationExceptionコードを実行しているアプリケーション ドメイン内で取得しようとしているアドレスを持つフィールドを格納するオブジェクトがない場合は例外です。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. フィールドのアドレスが存在するアプリケーション ドメインからのみアクセスできます。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またはその派生クラスの 1 つ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 値は 0x80131509 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 クラスの新しいインスタンスを初期化します。 Initializes a new instance of the InvalidOperationException class.

InvalidOperationException(SerializationInfo, StreamingContext)

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

InvalidOperationException(String)

指定したエラー メッセージを使用して、InvalidOperationException クラスの新しいインスタンスを初期化します。 Initializes a new instance of the InvalidOperationException class with a specified error message.

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

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

(Inherited from Exception)
HelpLink

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

(Inherited from Exception)
HResult

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

(Inherited from Exception)
InnerException

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

(Inherited from Exception)
Message

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

(Inherited from Exception)
Source

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

(Inherited from Exception)
StackTrace

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

(Inherited from Exception)
TargetSite

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

(Inherited from Exception)

方法

Equals(Object)

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

(Inherited from Object)
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()

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

(Inherited from Object)
GetObjectData(SerializationInfo, StreamingContext)

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

(Inherited from Exception)
GetType()

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

(Inherited from Exception)
MemberwiseClone()

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

(Inherited from Object)
ToString()

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

(Inherited from Exception)

イベント

SerializeObjectState

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

(Inherited from Exception)

適用対象

こちらもご覧ください