ฉันมีคลาสทั่วไปที่ควรอนุญาตประเภทใดก็ได้ดั้งเดิมหรืออย่างอื่น default(T)
ปัญหาเดียวกับนี้คือการใช้ เมื่อคุณเรียกค่าเริ่มต้นในประเภทค่าหรือสตริงค่าเริ่มต้นจะเริ่มต้นเป็นค่าที่เหมาะสม (เช่นสตริงว่าง) เมื่อคุณเรียกdefault(T)
ใช้ออบเจ็กต์จะส่งกลับค่าว่าง ด้วยเหตุผลหลายประการเราจำเป็นต้องตรวจสอบให้แน่ใจว่าหากไม่ใช่ประเภทดั้งเดิมเราจะมีอินสแตนซ์เริ่มต้นของประเภทไม่ใช่ค่าว่าง นี่คือความพยายาม 1:
T createDefault()
{
if(typeof(T).IsValueType)
{
return default(T);
}
else
{
return Activator.CreateInstance<T>();
}
}
ปัญหา - สตริงไม่ใช่ประเภทค่า แต่ไม่มีตัวสร้างที่ไม่มีพารามิเตอร์ ดังนั้นวิธีแก้ปัญหาปัจจุบันคือ:
T createDefault()
{
if(typeof(T).IsValueType || typeof(T).FullName == "System.String")
{
return default(T);
}
else
{
return Activator.CreateInstance<T>();
}
}
แต่นี่ให้ความรู้สึกเหมือนกากเดน มีวิธีที่ดีกว่าในการจัดการกับสายอักขระหรือไม่?