Tại sao trình biên dịch C# không phỏng đoán thực tế là FooExt.Multiply()
thỏa mãn chữ ký của Functions.Apply()
? Tôi phải xác định một biến đại biểu riêng biệt của loại Func<Foo,int,int>
cho mã để làm việc ... nhưng nó có vẻ như suy luận kiểu nên xử lý này. Liệu tôi có sai? Và, nếu có, tại sao?Tại sao trình biên dịch C# không tự động suy ra các loại trong mã này?
EDIT: Các lỗi biên dịch nhận được là:
Những lập luận kiểu cho phương pháp
FirstClassFunctions.Functions.Apply<T1,T2,TR>(T1, System.Func<T1,T2,TR>, T2)'
không thể được suy ra từ việc sử dụng. Cố gắng xác định các đối số loại một cách rõ ràng
namespace FirstClassFunctions {
public class Foo {
public int Value { get; set; }
public int Multiply(int j) {
return Value*j;
}
}
public static class FooExt {
public static int Multiply(Foo foo, int j) {
return foo.Multiply(j);
}
}
public static class Functions {
public static Func<TR> Apply<T1,T2,TR>(this T1 obj,
Func<T1,T2,TR> f, T2 val) {
return() => f(obj, val);
}
}
public class Main {
public static void Run() {
var x = new Foo {Value = 10};
// the line below won't compile ...
var result = x.Apply(FooExt.Multiply, 5);
// but this will:
Func<Foo, int, int> f = FooExt.Multiply;
var result = x.Apply(f, 5);
}
}
Sau đây cũng nên làm việc: 'x.Apply (mới Func (FooExt.Multiply), 5)'. Lỗi biên dịch là gì? –
thecoop
Dường như biên dịch tốt cho tôi, trong .NET 4.0. –
có thể trùng lặp của [C# 3.0 suy luận kiểu chung chung - chuyển một đại biểu dưới dạng tham số hàm] (http://stackoverflow.com/questions/407983/c-3-0-generic-type-inference-passing-a-delegate- as-a-function-parameter) – thecoop