首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >不带out参数的Func<T>

不带out参数的Func<T>
EN

Stack Overflow用户
提问于 2009-08-15 23:45:59
回答 4查看 58.4K关注 0票数 186

我可以将带有out参数的方法作为Func传递吗?

代码语言:javascript
复制
public IList<Foo> FindForBar(string bar, out int count) { }

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

listFunction需要一个类型,这样out就不会在那里编译,而调用Func需要int,并且不允许out in。

有没有办法做到这一点?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-08-15 23:54:27

refout不是类型参数定义的一部分,因此不能使用内置的Func委托来传递refout参数。当然,如果你愿意,你可以声明你自己的委托:

代码语言:javascript
复制
delegate V MyDelegate<T,U,V>(T input, out U output);
票数 245
EN

Stack Overflow用户

发布于 2009-08-15 23:51:20

为什么不创建一个类来封装结果呢?

代码语言:javascript
复制
public class Result
{
     public IList<Foo> List { get; set; }
     public Int32 Count { get; set; }
}
票数 26
EN

Stack Overflow用户

发布于 2013-12-13 14:26:07

Func委托家族(或Action )只是简单的委托类型,声明如下

代码语言:javascript
复制
//.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参数,所以在你的例子中,正如其他答案所指出的那样,这只是你自己定制实现的问题。至于为什么微软没有在默认情况下打包它,想想它需要的组合的数量。

代码语言:javascript
复制
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。这实际上会给开发人员带来麻烦和困惑。

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1283127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档