Tôi không nghĩ rằng tôi đang làm bất cứ điều gì quá bí truyền, nhưng tôi không thấy bất kỳ câu hỏi nào khác về điều này.C# loại đối số không thể được suy ra từ việc sử dụng trong Chọn với nhiều lợi nhuận
Đoạn mã sau (tôi đã giảm nó thành các yếu tố cần thiết) tạo ra lỗi trình biên dịch trong C# 4. Tuy nhiên, phải rõ ràng đối số kiểu là gì - có một mẫu số chung lớn nhất ("lớp A") cũng được định nghĩa rõ ràng trong kiểu trả về của phương thức "Frob". Không nên trình biên dịch tạo danh sách tất cả các kiểu trả về trong biểu thức lambda, tạo một cây tổ tiên để tìm tổ tiên chung của chúng, và sau đó điều chỉnh lại với kiểu trả về dự kiến của phương thức chứa?
Đối số kiểu cho phương thức 'System.Linq.Enumerable.Select (System.Collections.Generic.IEnumerable, System.Func)' không thể suy ra được khi sử dụng. Hãy thử xác định các đối số kiểu một cách rõ ràng.
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
namespace Sample
{
public abstract class A
{
private A(int index) { /* ... */ }
public sealed class A1 : A
{
public A1(string text, int index)
: base(index)
{ /* ... */ }
}
public sealed class A2 : A
{
public A2(int index)
: base(index)
{ /* ... */ }
}
private static Regex _regex = new Regex(@"(to be)|(not to be)");
public static IEnumerable<A> Frob(string frobbable)
{
return _regex.Matches(frobbable)
.Cast<Match>()
.Select((match, i) =>
{
if (match.Groups[1].Success)
{
return new A1(match.Groups[1].Value, i);
}
else
{
return new A2(i);
}
});
}
}
}
Bạn đã thử đúc A1 và A2 thành A trước khi quay lại chưa? Nhưng yeah, tôi có thể thấy lý do tại sao trình biên dịch phàn nàn, nó không kỳ diệu biết bạn muốn mẫu số chung là lớp A. –