11

このコードでは:

public bool SomeMethod(out List<Task> tasks)
{
    var task = Task.Factory.StartNew(() => Process.Start(info));
    tasks.Add(task);
}

「未割り当てのパラメータ「タスク」の使用」というエラーが表示されます。なんで?

MSDNの例では、outパラメーターを使用するだけです。

class OutExample
{
    static void Method(out int i)
    {
        i = 44;
    }

    static void Main()
    {
        int value;
        Method(out value);
        // value is now 44
    }
}

のせいですList<T>か?

4

5 に答える 5

16

メソッド本体でパラメーターを初期化する必要がありoutます(つまり、新しいList<Task>インスタンスを作成してパラメーターに割り当てoutます)。

public bool SomeMethod(out List<Task> tasks) {
  var task = Task.Factory.StartNew(() => Process.Start(info);
  tasks = new List<Task>() { task };
  ...
}

コレクション初期化構文を使用してタスクをリストに追加していますが、必要Addに応じて代わりにメソッドを呼び出すこともできます。

次のようにメソッドを呼び出す必要があります。

List<Task> tasks;
SomeMethod(out tasks);
var newTask = tasks[0]; // Access the task just created.

outC#7.0では、次のパラメーターを使用して関数の呼び出しで変数を宣言する、より単純な構文が導入されました。

SomeMethod(out var tasks);
var newTask = tasks[0]; // Access the task just created.

aList<T>は参照によって渡されるため、パラメーターを取り除くことができoutます。次に、メソッドを呼び出す前にリストを作成する必要があります。

public bool SomeMethod(List<Task> tasks) {
  var task = Task.Factory.StartNew(() => Process.Start(info);
  tasks.Add(task);
  ...
}

そしてそれをこのように呼んでください:

var tasks = new List<Task>();
SomeMethod(tasks);
var newTask = tasks[0]; // Access the task just created.

out一般に、パラメータは混乱を招く可能性があるため、避けることをお勧めします。

于 2011-05-24T13:43:29.997 に答える
4

outこれは、メソッドがオブジェクトを作成してから、それをパラメーターに割り当てる必要があることを意味します。

List<Task> tasks = new List<Task>();
tasks.Add(task);
于 2011-05-24T13:43:49.833 に答える
2

tasks = new List<Task>();Taskオブジェクトを追加する前に行う必要があります。MSDNには、実行していることに近い例があります。これは、intではなく配列を渡します。

于 2011-05-24T13:43:35.260 に答える
2

これは、-variable ...に値を割り当てなかったためですtasks。この場合、それはタイプのインスタンスへの参照になりますList<Task>

SomeMethodの本体に追加tasks = new List<Task>();すると、すべてが正常に機能します。

public bool SomeMethod(out List<Task> tasks) {
   tasks = new List<Task>();
   var task = Task.Factory.StartNew(() => Process.Start(info);
   tasks.Add(task);
}
于 2011-05-24T13:45:16.520 に答える
2

パラメータを初期化する必要がありtasksます。例えばtasks = new List<Task>()

このスレッドoutでは、パラメーターの使用とパラメーターについて説明refします。キーワードを使用する場合はref、メソッドを呼び出す前に値を設定しておく必要があります。refこの場合、キーワードを使用する理由はわかりませんが

于 2011-05-24T13:47:12.183 に答える