2012-04-05 30 views
8

Tôi đã có mã thực sự đơn giản:Task.Factory.StartNew() quá tải

static void Main(string[] args) 
{ 
    var task = Task.Factory.StartNew(GetInt); 

    var task2 = Task.Factory.StartNew(
     () => 
     { 
      return GetInt(); 
     }); 
} 

static int GetInt() 
{ 
    return 64; 
} 

Tại sao tôi lại nhận được một lỗi biên dịch cho nhiệm vụ đầu tiên? Chữ ký của phương thức (không có tham số, kiểu trả về là int) là bằng nhau, phải không?

Tôi biết một giải pháp (khá đơn giản: var task = Task.Factory.StartNew<int>(GetInt);) nhưng tôi muốn biết vấn đề với mã ở trên là gì.

+3

Lỗi trình biên dịch là gì? –

+0

Hãy thử bản thân mình, tôi chỉ có văn bản lỗi trình biên dịch tiếng Đức: 'Der Aufruf unterscheidet nicht eindeutig zwischen folgenden Methoden und Eigenschaften:" System.Threading.Tasks.TaskFactory.StartNew (System.Func ) "und" System.Threading. Tasks.TaskFactory.StartNew (Hệ thống.Hành động) "' nhưng nó không có ý nghĩa khiến 'GetInt' sẽ trả về' int' không 'void' – GameScripting

Trả lời

3

Bạn nhận được lỗi cuộc gọi không rõ ràng vì chữ ký phương thức giống nhau. Giá trị trả về không phải là một phần của chữ ký.

Vì bạn không cung cấp loại trả về rõ ràng, trình biên dịch không biết phải làm gì.

Method Signature in C#

+1

Tôi nghĩ bạn thực sự cần phải thuật lại câu trả lời của bạn: Hành động có nhiều loại khác với Func . Câu trả lời của bạn hiện đang đọc như thể triển khai 'StartNew' không nên biên dịch. – ChrisWue

+0

Lưu ý, cảm ơn bạn. – Alex

0

Bạn nhận được lỗi biên dịch vì phương thức StartNew có hoặc là một hành động (trả về void) hoặc một Func (trả về một cái gì đó) predicates với nó quá tải khác nhau, và không phải là một đại biểu trực tiếp.

+1

Điều đó nghe như một câu trả lời" vẫy tay ", cung cấp' 'cho tham số kiểu chung không theo bất kỳ cách nào làm cho các đại biểu nhiều như 'Action ' hoặc 'Func ', như vậy rõ ràng nó có thể suy ra rằng một phần của chính nó. –

+0

Cung cấp làm cho các cuộc gọi hoàn toàn rõ ràng. không có chữ ký 'nhiệm vụ StartNew (Action) '. –

+0

@ LasseV.Karlsen, Không chắc chắn lý do tại sao bạn sẽ nghĩ như vậy.Tôi nhận được 2 lỗi thời gian biên dịch khi tôi biên dịch mã - đầu tiên nói loại trả về cho GetInt là không đúng.Vì vậy bạn cần phải viết lại các cuộc gọi như 'code' var task2 = Task.Factory.StartNew (() => GetInt()); 'code' là phiên bản viết tắt của' code'var task = Task.Factory.StartNew (new Func (GetInt); 'mã'. –

1

sẽ giúp hiển thị các ngoại lệ: "Cuộc gọi là mơ hồ giữa các phương pháp sau đây hoặc tài sản: 'System.Threading.Tasks.TaskFactory.StartNew (System.Action)' và 'System.Threading .Tasks.TaskFactory.StartNew (System.Func) '"

Nếu bạn có một cái nhìn có hai phương pháp có thể:

public Task<TResult> StartNew<TResult>(Func<TResult> function); 
public Task StartNew(Action action); 

Nếu bạn thêm <int> hoặc cung cấp a Func<int> bạn buộc nó lấy chữ ký đầu tiên. Nếu không có mã của bạn là mơ hồ.

0

Như đã nêu bởi những người khác, bạn cần chuyển GetInt làm hàm thành StartNew hoặc chỉ định rằng bạn định trả về giá trị từ StartNew bằng cách cung cấp loại chung. Nếu không, trình biên dịch không có ý tưởng loại công việc bạn định tạo .... nó là mơ hồ.

static void Main(string[] args) 
{ 
    var task = Task.Factory.StartNew<int>(GetInt); 

    var task2 = Task.Factory.StartNew(
     () => 
     { 
      return GetInt(); 
     }); 
} 

static int GetInt() 
{ 
    return 64; 
} 
1

Đối với hồ sơ, sau đây là hai cách để làm việc đó (mà biên dịch):

var task3 = Task.Factory.StartNew((Func<int>)GetInt); 
var task4 = Task.Factory.StartNew(() => GetInt()); 
3

Bởi vì trình biên dịch không thể quyết định của hai quá tải này để sử dụng:

StartNew(Action) 
StartNew<TResult>(Func<TResult>) 

Lý do là kiểu trả về không phải là một phần của độ phân giải quá tải trong C# (giống như bạn không thể có hai quá tải chỉ khác nhau về kiểu trả về) và do đó trình biên dịch không thể quyết định liệu GetInt phải là Action hoặc Func<T>. Buộc sử dụng phiên bản chung bằng cách gọi StartNew<int>(GetInt) sẽ cung cấp thông tin bắt buộc.

+0

Đây là giải pháp tốt nhất cho detfinfly. –