簡體   English   中英

功能<T>沒有參數

[英]Func<T> with out parameter

我可以將帶有 out 參數的方法作為 Func 傳遞嗎?

public IList<Foo> FindForBar(string bar, out int count) { }

// somewhere else
public IList<T> Find(Func<string, int, List<T>> listFunction) { }

Func 需要一個類型,所以 out 不會在那里編譯,並且調用 listFunction 需要一個 int 並且不允許 out in。

有沒有辦法做到這一點?

refout不是類型參數定義的一部分,因此您不能使用內置的Func委托來傳遞refout參數。 當然,如果需要,您可以聲明自己的委托:

delegate V MyDelegate<T,U,V>(T input, out U output);

為什么不創建一個類來封裝結果?

public class Result
{
     public IList<Foo> List { get; set; }
     public Int32 Count { get; set; }
}

Func委托系列(或Action就此而言)只不過是簡單的委托類型,聲明如下

//.NET 4 and above
public delegate TResult Func<out TResult>()
public delegate TResult Func<in T, out TResult>(T obj)

//.NET 3.5
public delegate TResult Func<T1, T2, TResult>(T1 obj1, T2 obj2)
public delegate TResult Func<T1, T2, T3, TResult>(T1 obj1, T2 obj2, T3 obj3)

等。委托本身可以有 out/ref 參數,所以在你的情況下,它只是你自己自定義實現的問題,正如其他答案所指出的那樣。 至於為什么微軟沒有默認打包,想想它需要的絕對數量的組合。

delegate TResult Func<T1, T2, TResult>(T1 obj1, T2 obj2)
delegate TResult Func<T1, T2, TResult>(out T1 obj1, T2 obj2)
delegate TResult Func<T1, T2, TResult>(T1 obj1, out T2 obj2)
delegate TResult Func<T1, T2, TResult>(out T1 obj1, out T2 obj2)

僅用於兩個參數。 我們甚至沒有接觸過ref 對於開發人員來說,這實際上會很麻煩且令人困惑。

您可以將它包裝在一個 lambda/delegate/function/method 中,該方法暴露了正確的接口並稱為 FindForBar,但我懷疑 FindForBar 已將其視為 out 參數作為一個原因,因此您需要確保將這些信息扔掉ok/safe/desirable/有正確的結果(即使您可以直接傳入 FindForBar,您也需要確定這一點)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM