2009-02-19 29 views
10

Tôi đã tự hỏi liệu điều đó có khả thi không, vì 5 phút thử nghiệm của tôi tỏ ra không có kết quả.Chức năng nhận diện chung để sử dụng với suy luận kiểu

Tôi hy vọng nó sẽ được dễ dàng như:

T Identity<T>(T t) { return t; } 

Nhưng điều này không biên dịch về phương pháp chung lấy thông số Func. Ví dụ: OrderBy. Thậm chí chỉ định các tham số kiểu (chính xác là những gì tôi muốn tránh!), Nó không biên dịch được.

Tiếp theo, tôi đã cố gắng một cái gì đó tôi nghĩ sẽ làm việc:

Func<T, R> MakeIdentity<T, R>() 
{ 
    return (T t) => (R)(object)t; 
} 

Cũng không đi :((điều này biên dịch khi áp dụng các tham số kiểu, một lần nữa, không phải những gì tôi muốn)

Có ai có may mắn làm như vậy một điều

UPDATE:? xin vui lòng không nói: x => x, tôi biết rằng, nó rõ ràng tôi đang yêu cầu cho một chức năng, không phải là một biểu hiện :)

UPDATE 2: Khi tôi ref er để nhận dạng, tôi có nghĩa là trong ý nghĩa chức năng, nơi mà hàm chỉ đơn giản trả về cùng một đối tượng mà bạn đã truyền cho nó. Nó có lẽ là trong mọi ngôn ngữ chức năng mà tôi đã gặp, nhưng những thứ đó không sử dụng kiểu gõ tĩnh. Tôi tự hỏi làm thế nào để làm điều này (nếu có thể) với Generics. Chỉ để cho vui thôi!

UPDATE 3: Dưới đây là một phần 'giải pháp' dựa trên ý tưởng 2:

Expression<Func<T, T>> MakeIdentity<T>() 
{ 
    return t => t; 
} 

void Foo(string[] args) 
{ 
    var qargs = args.AsQueryable(); 
    var q = qargs.OrderBy(MakeIdentity<string>()); 
    ... 
} 

Tôi không nghĩ rằng bất cứ điều gì hơn điều này sẽ thực hiện được.

+0

Bạn đang cố gắng làm gì? –

+0

Cảm thấy mệt mỏi khi viết x => x :) Và thật sự tự hỏi. nó không phục vụ mục đích gì cả. – leppie

+0

Với C# 6.0 'myList.OrderBy (Identity);' sẽ hoạt động. – Henrik

Trả lời

3

Suy luận loại sẽ không hoạt động vì phương thức lưu trữ và phương thức nhập đều là chung. Để làm điều này bạn phải viết

myList.OrderBy<int, int>(Identity); 

Hoặc

myList.OrderBy((Func<int, int>)Identity); 
1

Sự cố bạn gặp phải là các hàm ẩn danh và nhóm phương pháp trong C# không tham gia vào suy luận kiểu. Các loại rõ ràng phải được đưa ra.

Điều bạn có thể làm là có chức năng Nhận dạng cho các chức năng ẩn danh. Ví dụ

Func<T> IdentityFunc1<T>(Func<T> func) { return func; } 

Tôi không hoàn toàn chắc chắn bạn đang làm gì với mẫu thứ hai. Bạn có thể xây dựng?

+1

Tôi nghĩ bạn hiểu sai danh tính. Đó là một chức năng thường được sử dụng trong ngôn ngữ chức năng, mà chỉ đơn giản là trả về những gì bạn cung cấp cho nó. – leppie

+0

Tôi nghĩ câu trả lời của bạn vẫn áp dụng mặc dù, cảm ơn :) – leppie

0

Tùy chọn đầu tiên làm việc cho tôi:

public class Foo { 

    public Foo(Func<MyObj, MyObj> map) {... } 

} 

public class Client { 

    private static T Identity<T>(T t) { return t; } 

    public void main() { 
     var foo = new Foo(Identity); 

     var c = from f in Enumerable.Range(0, 100) select Identity(f); 
     c.ToList().ForEach(System.Console.Out.WriteLine); 
    } 
} 
2

này làm việc cho tôi ở những nơi tôi đã cần nó cho đến nay.

internal class IdentityFunction<TSource> 
{ 
    public static Func<TSource, TSource> Instance 
    { 
     get { return x => x; } 
    } 
} 

OrderBy(IdentityFunction<Foo>.Instance) 
Các vấn đề liên quan