2014-10-09 102 views
2

泛型函数可以使用可为空的值类型,还是在幕后操作?泛型函数和值类型

比如我有一个辅助功能是这样的:

public static TResult Return<TInput, TResult>(this TInput o, Func<TInput, TResult> evaluator, TResult failureValue) 
    where TInput : class 
{ 
    if (o == null) return failureValue; 
    return evaluator(o); 
} 

我使用,提供一个备用的值时,一些为空,如

var log = person.Return(p => p.log, emptylog) 

所以,这取决于是否log是值或引用类型,我需要一个专门的版本Return()来处理值类型没有装箱,或者是上述所有情况下的好?

编辑:我很好奇,为什么这http://pastebin.com/vdS1uNu1的作者有类特 - >结构,类 - >类等

回答

3

不,不会框的值类型 - 但它导致创建方法的新本机实现(在JIT时间),每次您为TResult使用不同的值类型,而所有引用类型将共享相同的本机代码。这是非常很少有问题,但它不是像每次通话开销。这是“基于类型参数创建正确的本地代码”,它允许它避免装箱。

+0

谢谢。那么为什么这个代码为value/ref类型提供了专门的实现呢?难道一个不受约束的TResult只是起作用吗? http://pastebin.com/vdS1uNu1 – user826840 2014-10-09 15:33:37

+1

@ user826840:不,因为其中一些方法使用TResult? - 这只有在TResult被限制为非空值类型时才有效。 – 2014-10-09 15:38:34

+0

但是,如果我做的:'公共静态TResult MyTest的(此TInput输入,Func键拉姆达) \t \t { \t \t \t返回输入== NULL?默认(TResult):lambda(输入); \t \t} '它似乎工作时返回ref,值或可为空值类型。所以在特殊实现中毫无意义?我只是好奇他为什么打扰!谢谢 – user826840 2014-10-09 15:46:36