Dalam pertanyaan StackExchange yang berbeda, saya perhatikan seseorang menggunakan prototipe ini:
void DoSomething<T>(T arg) where T: SomeSpecificReferenceType
{
//Code....
}
Mengingat hanya ada satu jenis kendala ( SomeSpecificReferenceType
), apa perbedaan dan keuntungan menulisnya seperti itu, bukan hanya:
void DoSomething(SomeSpecificReferenceType arg)
{
//Code....
}
Dalam kedua kasus, arg
akan dikenakan pemeriksaan jenis waktu kompilasi. Dalam kedua kasus, tubuh metode dapat dengan aman mengandalkan pengetahuan yang arg
(atau merupakan keturunan) jenis tertentu yang dikenal pada waktu kompilasi.
Apakah ini kasus pengembang yang terlalu bersemangat belajar tentang obat generik sebelum belajar tentang warisan biasa? Atau adakah alasan yang sah mengapa tanda tangan metode ditulis seperti ini?
Jawaban:
Ya, mungkin memang begitu.
Mungkin . Secara umum, akan lebih masuk akal jika ada nilai balik yang terlibat
T
, atau parameter lain yang digunakanT
.Tapi, mungkin saja internal menggunakan kode
T
(mungkin sebagai argumen untuk serializer?) Dan perlu menggunakan secara khususT
dan bukan kelas kendala. Anda kadang-kadang akan melihat bahwa ketika kendala adalah antarmuka yang dipasangkan dengannew
kendala dan keberanian dari metode menciptakanT
untuk beberapa alasan.Jadi walaupun jarang melihat versi kendala yang dibutuhkan, ada kalanya itu. Dan selalu mungkin bahwa metode dulu membutuhkannya, tetapi sekarang tidak dan pengembang membiarkannya untuk tidak memperkenalkan perubahan yang melanggar.
sumber
Saya pikir saya ingat diri saya mengetik jawaban yang berisi ini.
Pada saat itu alasannya seperti ini:
(Kode mungkin berbeda. Hanya untuk mengilustrasikan salah satu alasan yang mungkin mengapa ada batasan pada parameter tipe dalam metode generik.)
Pada dasarnya, kode masuk ke manipulasi jenis coding secara manual itu sendiri. Mungkin juga dicampur dengan beberapa hal refleksi.
Misalnya, dengan menggunakan
Method<T>(T arg) where T : ...
, seseorang dapat menggantiarg.GetType()
dengantypeof(T)
. Padahal, saya tidak tahu apakah pilihan itu baik atau buruk.Saya kira ini hanyalah contoh dari penulis (mungkin saya, atau orang lain) yang tidak dengan hati-hati memikirkan semua kemungkinan pengkodean, pada saat yang sama terlalu fokus pada pertanyaan / masalah yang berbeda.
sumber