以下函数对尝试复制C#6.0中可用的空条件运算符:
public static TResult Bind<T, TResult>(this T obj, Func<T, TResult> func)
where T : class
{
return obj == null ? default(TResult) : func(obj);
}
public static TResult Bind<T, TResult>(this Nullable<T> obj, Func<T, TResult> func)
where T : struct
{
return obj.HasValue ? func(obj.Value) : default(TResult);
}
Run Code Online (Sandbox Code Playgroud)
第一个函数被约束到类,并且String s允许我写一些类似的东西:
var x = s.Bind(a => a.Substring(1));
Run Code Online (Sandbox Code Playgroud)
第二个功能是我遇到麻烦的地方.例如,给int? number我一个我想写的:
var y = number.Bind(a => a + 1);
Run Code Online (Sandbox Code Playgroud)
但是,这给了我以下错误:
以下方法或属性之间的调用是不明确的:'BindingExtensions.Bind <T,TResult>(T,Func <T,TResult>)'和'BindingExtensions.Bind <T,TResult>(T?,Func <T,TResult >)"
我猜这与匿名函数的类型推断和方法重载决策之间的相互作用有关.如果我指定a的类型,int那么编译就好了.
var …Run Code Online (Sandbox Code Playgroud) 我有两种使用这些签名的方法:
void Method<T>(T data)
{
}
void Method<T>(IEnumerable<T> data)
{
}
Run Code Online (Sandbox Code Playgroud)
它采用相同方法的重载来获取单个对象或它们的列表.如果我尝试将List <'T>传递给它,它会解析为第一种方法,当我想要第二种方法时.我必须使用list.AsEnumerable()来解析它到第二个.无论列表是类型T [],IList <'T>,List <'T>,Collection <'T>,IEnumerable <'T>等,有没有办法让它解析为秒.
c# ×2