2012-04-20 61 views
2

異步Sub這樣的:異步lambda表達式中VB.NET

Dim f As Func(Of Task) = Async Sub() 
         End Sub 

可生產編譯器錯誤:

error BC36670: Nested sub does not have a signature that is compatible with delegate 'System.Func(Of System.Threading.Tasks.Task)'.

等效C#代碼編譯罰款:

Func<Task> f = async() => { }; 

Async Sub改寫成Async Function使代碼有效。

爲什麼Async Sub()不能轉換爲返回值類型爲Task的委託類型?

回答

4

VB.NET Sub相當於C#返回voidasync void Foo() {}async Task Foo() {}之間有區別,而你的VB.NET正在做前者,而你需要後者。正如你所提到的,Async Function使它的工作,因爲那麼它實際上是後者。

編輯:一些更多的細節:

C#:

async void Foo() { } 

async Task Bar() { } 

void Baz() 
{ 
    object dummy; 
    dummy = (Action) Foo; // OK 
    dummy = (Func<Task>) Foo; // error 
    dummy = (Action) Bar; // error 
    dummy = (Func<Task>) Bar; // OK 
} 

然而,這變得有點多混亂的時候使用的代表,因爲FooBar委託等價物看起來是一樣的:async() => { }

唯一的區別是,在VB.NET中,代表看起來不一樣,因爲SubFunction關鍵字仍然是其中的語法的一部分。

+0

VB.NET'Function'實際上意味着某些值將從方法返回。在上面的代碼中沒有返回值,所以lambda-'Function'實際上應該是lambda-'Sub「。你有沒有在VB.NET中看到沒有'Return'語句的'Function'? – ControlFlow 2012-04-20 12:14:08

+0

@ControlFlow C#等價物確實返回一個值,並且該值是一個「任務」。該任務的返回是隱含的:你沒有'return'語句,但你確實返回了一些東西。在VB.NET中是一樣的。 – hvd 2012-04-20 12:15:52

+1

@hvd我認爲問題是,雖然C#'async'關鍵字用於將'void'函數的聲明轉換爲'Func ',但在VB.NET中出現'Async' ** not **宣佈一個「Sub」成同樣的東西。請注意,在C#示例中,我們可以採用'()=> {}'(它不返回任何內容,因此對應於VB.NET'Sub'),並通過預先將其分配給'Func ' 'async' - 類似的過程出現* not *在VB.NET中工作。無論如何,我認爲這是個問題。 – AakashM 2012-04-20 12:22:53