मैं कुछ अलग-अलग प्रकार के सरणी (उदाहरण के लिए double[]
, float[]
, int[]
) के साथ एक छोटी परियोजना पर काम कर रहा हूं। सत्यापन/परीक्षण/स्वच्छता उद्देश्यों के लिए, मैं इन सरणी में से कुछ को कंसोल पर प्रिंट कर रहा हूं क्योंकि मैं साथ जाता हूं। इसलिए मैं कई कार्यों कि नीचे इन की तरह लग रही है (इस उदाहरण के लिए सरल बनाया - मान मैं केवल एकल आयाम सरणियों के साथ काम कर रहा हूँ):सिस्टम क्यों नहीं हो सकता है। ऐरे एक प्रकार की बाधा बनें?
void Print(float[] a) // prints an array of floats
{
for (int i = 0; i < a.Length; i++)
{
Console.Write(a[i]);
}
}
void Print(double[] a) // prints an array of doubles
{
for (int i = 0; i < a.Length; i++)
{
Console.Write(a[i]);
}
}
मैं अपने अनंत ज्ञान में, सोचा था कि मैं से कुछ कम हो सकता है इन कार्यों के सामान्य संस्करण को बनाकर कोड डुप्लिकेशन। इसलिए मैंने यह कोशिश की:
void Print<T>(T t) where T : Array
{
for (int i = 0; i < t.Length; i++)
{
Console.Write(t.GetValue(i));
}
}
Intellisense शिकायत नहीं है, लेकिन संकलक एक बहुत ही दिलचस्प त्रुटि के साथ विफल:
Constraint cannot be special class 'System.Array'
मैं एक विवरण (Object
के लिए इसी तरह के लिए देखा या सील वर्गों की है, लेकिन एक के अलावा ज्यादा नहीं मिला है, on msdn का उल्लेख करें। क्या कोई मुझे बता सकता है क्यों यह मामला है? मैं System.Array
की एक प्रकार की बाधा निर्दिष्ट क्यों नहीं कर सकता?
पुनश्च: एक ओर जहां यह पूरा लिखने, मुझे एहसास हुआ कि मैं पूरा कर सकते हैं कि क्या मैं मूल रूप से और अधिक आसानी से चाहता था, इस तरह एक साधारण समारोह के साथ:
void Print(System.Array a)
{
for (int i = 0; i < a.Length; i++)
{
Console.Write(a.GetValue(i));
}
}
इस कारण है कि संकलक में सरणियों के लिए एक विशेष नियम है है ?
void Print<T>(T[] array)
{
for (int i = 0; i < array.Length; i++)
{
Console.Write(array[i]);
}
}
समझ में आता है, लेकिन मैं अभी भी उत्सुक हूं _why_ मेरे पास 'ऐरे' की बेस क्लास प्रकार की बाधा नहीं हो सकती है ... – vlad
इसके अलावा, जिज्ञासा से, क्या यह 'ऐरे' प्रकार के पैरामीटर का उपयोग करने से अलग है? अगर मैं 'ऐरे' का उपयोग करता हूं तो क्या कुछ मुक्केबाजी चल रही है? – vlad
@vlad कोई मुक्केबाजी नहीं है क्योंकि सरणी संदर्भ प्रकार हैं, मूल्य प्रकार नहीं, हालांकि आप बॉक्सिंग कर रहे हैं जो आप टाइप किए गए सरणी के विपरीत इसे प्राप्त करते हैं। यह भी वही नहीं है क्योंकि 'ऐरे' 2, 3, या एन dimentional सरणी, या एक सरणी भी हो सकती है जो 0 अनुक्रमित नहीं है। – Servy