【发布时间】:2020-02-05 21:58:49
【问题描述】:
我正在尝试构建一个看起来像这样的Dictionary:
var getValueFuncs = new Dictionary<TypeID, Func<string, object>>
{
{TypeID.BINARY, NotMine.GetBinaryValue},
{TypeID.BOOLEAN, NotMine.GetBooleanValue},
{TypeID.DATE, NotMine.GetDateTimeValue},
{TypeID.DOUBLE, NotMine.GetFloat64Value},
{TypeID.LONG, NotMine.GetInteger32Value},
{TypeID.STRING, NotMine.GetStringValue}
};
我想放入的各种Funcs都有不同的返回类型。
public interface INotMine : ICollection, ICloneable
{
byte[] GetBinaryValue(string propName);
bool? GetBooleanValue(string propName);
DateTime? GetDateTimeValue(string propName);
double? GetFloat64Value(string propName);
int? GetInteger32Value(string propName);
string GetStringValue(string propName);
}
请注意,NotMine 是一个单独的类,它继承自 INotMine,我无法更改它。
用返回byte[] 和string 的过程初始化Dictionary 的两行代码编译没有问题。 返回可空数据类型的过程的四行(即bool?、DateTime?、double? 和int?)不会编译。他们每个人都报告一个这样的错误:
bool? INotMine.GetBooleanValue(string propName)
'bool? INotMine.GetBooleanValue(string)' has the wrong return type
Expected a method with 'object GetBooleanValue(string)' signature
鉴于一切都继承自object,为什么这些行不能编译并很好地进入我的Dictionary?
编辑: 在他删除之前,有人发布了一个答案,其中包含一个优雅的解决方法,如下所示:
{TypeID.BINARY, s => NotMine.GetBinaryValue(s)}
对此我很感激,我会使用它,但我仍然想知道为什么原始行无法编译。
【问题讨论】:
-
它们无法编译,因为 C# 编译器拒绝隐式发出包装委托以将值类型
Nullable<T>转换为object,这需要装箱转换(这基本上是解决方法提供)。是的,每种类型名义上都继承自object,包括值类型,但它们仍然被特殊对待。