ใน c # 'where T: class' หมายถึงอะไร?


135

ใน C # where T : classหมายความว่าอย่างไร?

กล่าวคือ

public IList<T> DoThis<T>() where T : class

คำตอบ:


115

เพียงแค่ใส่สิ่งนี้คือการ จำกัด พารามิเตอร์ทั่วไปให้กับคลาส (หรือโดยเฉพาะอย่างยิ่งประเภทการอ้างอิงซึ่งอาจเป็นคลาสอินเทอร์เฟซผู้ร่วมประชุมหรือประเภทอาร์เรย์)

ดูบทความ MSDN นี้สำหรับรายละเอียดเพิ่มเติม


4
คุณพลาดไปหนึ่งกรณี อาร์กิวเมนต์ชนิดของ T ยังสามารถใด ๆ พารามิเตอร์ชนิดอื่น ๆ ที่เป็นข้อ จำกัด ที่จะเป็นชนิดการอ้างอิง
Eric Lippert

38

มันเป็นข้อ จำกัด ประเภททั่วไป ในกรณีนี้หมายความว่าประเภททั่วไปTจะต้องเป็นประเภทอ้างอิง (คลาสอินเทอร์เฟซผู้ร่วมประชุมหรือประเภทอาร์เรย์)


35

เป็นข้อ จำกัด ประเภทTโดยระบุว่าต้องเป็นคลาส

whereข้อสามารถนำมาใช้เพื่อระบุข้อ จำกัด ประเภทอื่น ๆ เช่น:

where T : struct // T must be a struct
where T : new()  // T must have a default parameterless constructor
where T : IComparable // T must implement the IComparable interface

สำหรับข้อมูลเพิ่มเติมโปรดดูที่หน้า MSDN บนwhereข้อหรือข้อ จำกัด พารามิเตอร์ทั่วไป


5
เป็นไปได้ที่จะรวมสิ่งเหล่านี้เข้าด้วยกันเช่นwhere T : class, IComparable, new()
Izzy

17

ที่ จำกัดTการอ้างอิงประเภท คุณจะใส่ประเภทค่า ( structs และประเภทดั้งเดิมยกเว้นstring) ที่นั่นไม่ได้


คำตอบนี้ (และอีกสองข้อที่มีข้อมูลเดียวกัน) มีประโยชน์สำหรับฉันมากกว่าคำตอบที่เลือกเพราะมันให้ตัวอย่างของสิ่งที่ T เป็นไปไม่ได้ (ฉันสงสัยว่าข้อ จำกัด นี้เพิ่มเข้ามาในเรื่องราวอย่างไร)
นาที

9

หมายความว่าประเภทที่ใช้Tเมื่อใช้วิธีการทั่วไปจะต้องเป็นคลาส - กล่าวคือไม่สามารถเป็นโครงสร้างหรือสร้างขึ้นในจำนวนเช่นintหรือdouble

// Valid:
var myStringList = DoThis<string>();
// Invalid - compile error
var myIntList = DoThis<int>();

8

where T: class หมายถึงอย่างนั้นT has to be a classจริงๆ สามารถอ้างอิงประเภทใดก็ได้ ตอนนี้เมื่อใดก็ตามที่รหัสใด ๆ ของคุณเรียกDoThis<T>()วิธีการนั้นจะต้องให้ระดับการแทนที่T ตัวอย่างเช่นถ้าฉันจะเรียกDoThis<T>()วิธีของคุณฉันจะต้องเรียกมันว่าดังต่อไปนี้:

DoThis<MyClass>();

หากวิธีการของคุณเป็นดังนี้:

public IList<T> DoThis<T>() where T : class
{
   T variablename = new T();

   // other uses of T as a type

}

จากนั้น T ที่เคยปรากฏในวิธีการของคุณมันจะถูกแทนที่ด้วย MyClass ดังนั้นวิธีสุดท้ายที่คอมไพเลอร์เรียกใช้จะมีลักษณะดังนี้:

public IList<MyClass> DoThis<MyClass>() 
{
   MyClass variablename= new MyClass();

  //other uses of MyClass as a type

  // all occurences of T will similarly be replace by MyClass
 }

4
-1: new T()เป็นไปไม่ได้ด้วยwhere T : class. คุณต้องระบุว่าwhere T: new()ได้รับอนุญาตให้ทำได้
esskar

@explorer เราสามารถกำหนดวิธีการทั่วไปเพียงวิธีเดียวและเรียกใช้จากหลายที่เพื่อแทรกระเบียนโดยส่งผ่านพารามิเตอร์ที่แตกต่างกันจากที่ต่างๆ
Zaker

4

เรียกว่าข้อ จำกัด ประเภทพารามิเตอร์ มัน จำกัด ประเภท T ได้อย่างมีประสิทธิภาพ

อาร์กิวเมนต์ประเภทต้องเป็นประเภทอ้างอิง นอกจากนี้ยังใช้กับคลาสอินเทอร์เฟซผู้ร่วมประชุมหรือประเภทอาร์เรย์

ข้อ จำกัด เกี่ยวกับพารามิเตอร์ประเภท (คู่มือการเขียนโปรแกรม C #)


4

T หมายถึงประเภทออบเจ็กต์ซึ่งหมายความว่าคุณสามารถกำหนดประเภทของ. IList: ถ้า IList s = IList ใหม่; ตอนนี้ s.add ("ยอมรับสตริงเสมอ")



1

'T' หมายถึงประเภททั่วไป หมายความว่าสามารถรับคลาสประเภทใดก็ได้ บทความต่อไปนี้อาจช่วยได้:

http://www.15seconds.com/issue/031024.htm
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.