怎么施放lambdas?

时间:2012-09-08 10:57:01

标签: .net c#-4.0 casting lambda

我希望将一系列函数保存在一个从某种基类型派生的字典中(例如,为了清酒而调用基类“对象”)。那么,有可能将f1保持在f2吗?

Func<bool> f1 = () => true;
Func<object> f2 = f1;
  

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

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

Func<bool> f1 = () => true;
Func<object> f2 = () => (object)f1;

错误:(无)

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


跟随Armen的信息,我挖掘了字符串和布尔的定义:

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

public struct Boolean : IComparable, IConvertible, IComparable<Boolean>,
                        IEquatable<Boolean>

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

  

“ValueType会覆盖Object中的虚拟方法   适当的值类型实现。另见Enum,其中   继承自ValueType。“

对象:

  

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

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

2 个答案:

答案 0 :(得分:3)

如果您使用的是.NET 4.0+,则可以这样做。

您的示例不起作用,因为bool是值类型。但是,如果您要使用字符串更改bool,则示例将起作用。

    Func<string> f1 = () => "true";
    Func<object> f2 = f1;

答案 1 :(得分:3)

来自here(强调我的):

  

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

Also

  

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

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

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

Func<object> f2 = () => f1();