2010-01-29 27 views
6

Đây là mã của tôigiao diện Generic

public interface ITranslator<E, R> 
{  
    E ToEntity<T>(R record); 
} 

class Gens : ITranslator<string, int> 
{ 
    #region ITranslator<string,int> Members 

    public string ToEntity<MyOtherClass>(int record) 
    { 
     return record.ToString(); 
    } 

    #endregion 
} 

Khi tôi biên dịch này, tôi nhận được một lỗi Type parameter declaration must be an identifier not a type

Tại sao là tôi không thể có ToEntity<MyOtherClass> nhưng chỉ có thể có ToEntity<T> ??

Chỉnh sửa: MyOtherClass đang làm gì? Tôi đang chuyển đổi giữa các thực thể (POCO tương đương với khung Entity) và bản ghi (Object được trả về bởi khung công tác) cho nhiều bảng/lớp. Vì vậy, tôi muốn sử dụng điều này để thực hiện chuyển đổi cụ thể theo lớp của mình

+2

@Ram, bạn cần cho chúng tôi biết: 'MyOtherClass' được cho là tham gia vào phương thức' Gens.ToEntity' của bạn như thế nào? Từ mã nó không rõ ràng chút nào. Nếu chúng tôi biết ý định của bạn đằng sau nó, chúng tôi có thể cung cấp một số phản hồi hữu ích hơn. –

Trả lời

9

Giao diện của bạn có phương thức chung là ToEntity<T> mà bạn đã thực hiện không chung chung trong lớp triển khai GensToEntity<MyOtherClass>. (A generic phương pháp có thể mất bất kỳ tham số kiểu, có thể đưa ra những hạn chế nhất định trên T. Lớp Gens bạn đang cố gắng để cung cấp một định nghĩa cho ToEntitychỉ cho tham số kiểu MyOtherClass, mà đánh bại mục đích của Generics.)

Trong ví dụ mã của bạn, không rõ lớp Gens của bạn đang cố sử dụng loại MyOtherClass; nó chắc chắn không liên quan đến logic của ToEntity. Chúng tôi cần thêm thông tin để có thể hướng dẫn thêm cho bạn.

Để minh họa, đây là những gì định nghĩa hiện tại của bạn giao diện ITranslator<E, R> chào hàng, bằng tiếng Anh:

"Tôi cung cấp một cơ chế để dịch bất kỳ bản ghi loại R thành một thực thể loại E, cơ chế này là phụ thuộc vào bất kỳ loại người dùng nào được chỉ định T. "

bạn Gens lớp, mặt khác, cách thức mà nó hiện đang được thiết kế, "thực hiện" giao diện trên như sau:.

"Tôi có thể dịch các số nguyên thành các chuỗi tôi cung cấp các ảo tưởng cho phép người dùng chỉ định một loại để kiểm soát cách dịch này được thực hiện, nhưng trên thực tế không có sự lựa chọn nào về loại. Lớp MyOtherClass có liên quan bằng cách nào đó; Tôi có thể nói."

Từ hai giới thiệu này, thì rõ ràng rằng Gens lớp là không thực sự làm những gì giao diện ITranslator<E, R> đảm bảo.Cụ thể, nó không sẵn sàng chấp nhận một loại người dùng chỉ định cho phương pháp ToEntity của nó. Đó là lý do tại sao mã này sẽ không biên dịch cho bạn.

+1

câu trả lời sáng suốt rất đẹp. Lớp không thực hiện giao diện theo tinh thần thực sự của nó. Do đó lỗi – ram

1

Điều đó biên dịch OK cho tôi trong LINQpad. Có lẽ bạn có một loại có tên là E, R, hoặc T ở đâu đó?

Ahh tôi thấy những gì bạn đang cố gắng làm ... bạn có MyOtherClass được định nghĩa là một lớp ở đâu đó nhưng bạn đang cố gắng sử dụng nó như một đối số kiểu trong ToEntity. Làm thế nào chính xác bạn muốn MyOtherClass tham gia vào ToEntity?

+0

không thành công trong vs2008 – ram

+2

Mã đó do chính nó mà bạn dán thực sự là mã hợp lệ và biên dịch tốt. Tôi không hoàn toàn chắc chắn bạn đang định làm gì với MyOtherClass trong ví dụ của bạn. – Josh

2

Bạn phải khai báo ràng buộc về loại chung.

public string ToEntity<T>(int record) where T : MyOtherClass