2011-05-24 115 views
9

在此代碼:List <T> as'out'參數會導致錯誤。爲什麼?

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>

回答

11

你必須初始化方法體的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. 

如果你真的想創建列表調用方法前簡單地去掉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參數,因爲它們可能會造成混淆。

+0

並且在退出SomeMethod之後,原來的'任務'將具有來自此SomeMethod的項目?我問,因爲在這一刻有很多線程,並不是所有的工作都正常,所以我無法驗證它 – Saint 2011-05-24 14:22:01

+0

我不能通過價值傳遞,因爲我需要拿起更高級別的所有'任務' – Saint 2011-05-24 14:23:39

+0

有沒有這樣的事情按價值傳遞'列表'。它是一個引用類型,不是值類型。 – 2011-05-24 19:10:25

2

在添加任務對象之前,您需要執行tasks = new List<Task>();。 MSDN has an example這更接近你在做什麼,這通過一個數組而不是一個int。

4

out意味着你的方法需要創建對象,然後將其分配給參數:

List<Task> tasks = new List<Task>(); 
tasks.Add(task); 
+0

是不是宣告它夠了? (假定您將在方法中初始化它。)例如'列表 myTask = null;' – Albireo 2011-05-24 13:46:23

+0

設置'tasks = null;'會刪除編譯器有關初始化的錯誤,但是你會在'tasks.Add(task)上得到運行時錯誤;' – takrl 2011-05-24 13:57:23

+0

不需要設置它。這就是'out'的意思。 – 2011-05-24 14:00:09

2

那是因爲你沒有分配一個值tasks -variable ......在這種情況下將是對List<Task>類型實例的引用。

添加tasks = new List<Task>();到的someMethod的身體,一切都將正常工作:

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

您需要初始化tasks參數。例如tasks = new List<Task>()

This thread討論了帶參數的outref的使用。如果您使用ref關鍵字,則必須在調用方法之前設置該值。我認爲沒有理由在這種情況下使用ref關鍵字

相關問題