怎么施放lambdas?

sgt*_*gtz 10 .net lambda casting c#-4.0

我希望将一系列函数保存在一个源自某种基类型的字典中(例如,让我们调用基类"对象").那么,有可能将f1保持在f2吗?

Func<bool> f1 = () => true;
Func<object> f2 = f1;
Run Code Online (Sandbox Code Playgroud)

错误1无法将类型隐式转换System.Func<bool>System.Func<object>

这是我们能做的最好的吗?

Func<bool> f1 = () => true;
Func<object> f2 = () => (object)f1;
Run Code Online (Sandbox Code Playgroud)

错误:(无)

我想它需要通用友好是一个where语句...但我不确定你是否可以用lamdas做到这一点.


关注Armen的信息,我挖掘了字符串和bool的定义:

public sealed class String : IComparable, ICloneable, IConvertible, IEnumerable,
                             IComparable<String>, IEnumerabl<char>,
                             IEquatable<String> 

public struct Boolean : IComparable, IConvertible, IComparable<Boolean>,
                        IEquatable<Boolean>
Run Code Online (Sandbox Code Playgroud)

他对ref Vs的价值是正确的.String是否隐式派生自对象?根据@ PeterK的链接看起来这是结构的行为.

"ValueType会覆盖Object中的虚方法,并为值类型提供更合适的实现.另请参阅Enum,它继承自ValueType."

宾语:

System.Object:所有类,结构,枚举和委托.(来自http://msdn.microsoft.com/en-us/library/system.object)

这反过来又Func<bool>无法分配到Func<object>一点点愚蠢.即从这个角度看,继承层次结构是正确的.

Jor*_*dão 3

这里(强调我的):

协方差使您能够使用比泛型参数指定的派生类型更多的类型。这允许实现变体接口的类的隐式转换和委托类型的隐式转换。引用类型支持协变和逆变,但值类型不支持它们

方差仅适用于引用类型;如果为变体类型参数指定值类型,则该类型参数对于生成的构造类型是不变的。

原因可能与 C# 和 CLI 历史上如何处理(并且不同意)值类型的数组协方差有关。在这里查看一些信息。

所以你看,类型参数的协方差Func<out TResult>不适用于值类型,所以你必须这样做:

Func<object> f2 = () => f1();
Run Code Online (Sandbox Code Playgroud)