2012-12-24 31 views
11

संभव डुप्लिकेट अधिक भार:
Arithmetic operator overloading for a generic class in C#ऑपरेटर जेनरिक साथ

यहाँ सामान्य वर्ग मैं ऑपरेटर ओवरलोड जटिल संख्या जोड़ने के लिए बनाया है के लिए कोड है।

public class Complex<T> 
{ 
    public T _a, _b; 
    public Complex(T i, T j) 
    { 
     _a = i; 
     _b = j; 
    } 
    public static Complex<T> operator +(Complex<T> i, Complex<T> j) 
    { 
     return new Complex<T>(i._a + j._a, i._b + j._b); 
    } 
} 

इस मैं की एक त्रुटि मिल गया है के साथ काम करते हुए,

Error: Operator '+' cannot be applied to operands of type 'T' and 'T' 

किसी भी एक मुझे जिस तरह से मैं ऑपरेटर का उपयोग कर सकते जेनरिक के साथ अधिक भार का सुझाव कर सकते हैं?

+1

http://stackoverflow.com/questions/756954/arithmetic-operator-overloading-for-a-generic-class-in- सी-तेज – Habib

+0

और यह भी: http://stackoverflow.com/questions/147646/solution-for-overloaded-operator-constraint-in-net- जनरेटर ऑपरेटर अधिभार के साथ मूल्य प्रकारों को परिभाषित करने में सक्षम नहीं है सी # की गंभीर सीमा है । उपलब्ध बस के आसपास कोई संतोषजनक काम नहीं है। – citykid

+0

यह पहली जगह में सामान्य नहीं होना चाहिए। केवल एक सामान्य बनाओ जब यह समझ में आता है कि ** कोई ** प्रकार है; यही कारण है कि उन्हें * जेनेरिक * कहा जाता है। –

उत्तर

22

समस्या यह है कि संकलक यह नहीं जान सकता कि + ऑपरेटर T पर लागू किया जा सकता है। दुर्भाग्यवश, सी # में संख्यात्मक प्रकार होने के लिए T को बाधित करने का कोई तरीका नहीं है। dynamic प्रकार के रूप में

public class Complex<T> where T : struct 
{ 
    public T _a, _b; 
    public Complex(T i, T j) 
    { 
     _a = i; 
     _b = j; 
    } 
    public static Complex<T> operator +(Complex<T> i, Complex<T> j) 
    { 
     return new Complex<T>(Sum(i._a, j._a), Sum(i._b, j._b)); 
    } 

    private static T Sum(T a, T b) 
    { 
     return (dynamic)a + (dynamic)b; 
    } 
} 
+0

वाह। मैंने इस सवाल को कई बार देखा है, लेकिन मैंने कभी यह जवाब नहीं देखा है। मैं अतीत में ओप कोड उत्सर्जित करने के लिए वापस लौटा, जो 'गतिशील)' कास्ट करने के लिए प्रतीत होता है। दिलचस्प। – ja72

0

आप दो जेनेरिक ऑब्जेक्ट प्रकार का योग नहीं कर सकते; स्थैतिक फ़ंक्शन में आप टी i._a और j._a प्रकार के दो तत्वों को जोड़ने का प्रयास कर रहे हैं, लेकिन टी किसी भी प्रकार का

क्या करने का प्रयास कर सकता है?

2

आप धोखा देने के लिए चाहते हैं, आप अस्थायी रूप से उन्हें चिह्नित कर सकते हैं और क्रम कैसे करना है यह निर्धारित करने के लिए अनुमति देते हैं:

हालांकि, अगर आप इस गतिशील क्रम का उपयोग कर वैकल्पिक हल करने में सक्षम हो सकता है। जब तक आप T टाइप करते हैं, तो + ऑपरेटर को परिभाषित करता है, यह काम करेगा। इसका मतलब है कि यह दोनों संख्याओं और तारों, या जो भी प्रकार (कस्टम या अन्यथा) के लिए काम करेगा; सुनिश्चित नहीं है कि यह Complex के लिए आपका इरादा है या नहीं। इसके अतिरिक्त, यदि + ऑपरेटर का लाभ उठाने के लिए कोई ऑपरेटर नहीं है, तो अपवाद रनटाइम पर फेंक देगा; इस के लिए संकलन समय जांच करने के लिए कोई रास्ता नहीं है (जिसे मैं जानता हूं)। तार के साथ

public class Complex<T> 
{ 
    public T _a, _b; 
    public Complex(T i, T j) 
    { 
     _a = i; 
     _b = j; 
    } 
    public static Complex<T> operator +(Complex<T> i, Complex<T> j) 
    { 
     dynamic d_i = i; 
     dynamic d_j = j; 
     return new Complex<T>(d_i._a + d_j._a, d_i._b + d_j._b); 
    } 
} 

नमूना उपयोग:

Complex<string> i = new Complex<string>("Hel", "Wor"); 
Complex<string> j = new Complex<string>("lo ", "ld!"); 

Complex<string> ij = i + j; 

Console.WriteLine(ij._a + ij._b); //Hello World! 
0

ऊपर उल्लेख किया है, आप T विवश कर सकता है IConvertible होने के लिए और फिर इच्छित गणितीय समारोह में प्रदर्शन करने के लिए decimal प्रकार का उपयोग इस प्रकार है:

public class Complex<T> where T : struct, IConvertible 
{ 
    public T _a, _b; 

    public Complex(T i, T j) 
    { 
     _a = i; 
     _b = j; 
    } 

    public static Complex<T> operator +(Complex<T> i, Complex<T> j) 
    { 
     return new Complex<T>(Sum(i._a, j._a), Sum(i._b, j._b)); 
    } 

    private static T Sum(T a, T b) 
    { 
     return (T)Convert.ChangeType(a.ToDecimal(CultureInfo.CurrentCulture) + b.ToDecimal(CultureInfo.CurrentCulture), typeof(T)); 
    } 
}