相关疑难解决方法(0)

C#为什么这种类型的推断方法调用模糊不清?

以下函数对尝试复制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)

c#

11
推荐指数
1
解决办法
291
查看次数

通用重载方法解析问题

我有两种使用这些签名的方法:

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#

7
推荐指数
1
解决办法
453
查看次数

标签 统计

c# ×2