मैं एक कक्षा लिख रहा हूं जो अनिवार्य रूप से सी # में प्रत्येक आदिम संख्यात्मक प्रकारों के लिए समान प्रकार की गणना करता है। यद्यपि असली गणना अधिक जटिल है, इसके बारे में सोचें कि कई मूल्यों की औसत गणना करने के लिए एक विधि के रूप में, उदाहरण के लिएजेनेरिक सी # कोड और प्लस ऑपरेटर
class Calc<T>
{
public T Count { get; private set; }
public T Total { get; private set; }
public T Average { get { return Count/Total; } }
public T AddDataPoint(T data)
{
Total += data;
Count++;
}
}
दुर्भाग्य से सी # करने में असमर्थ है:
class Calc
{
public int Count { get; private set; }
public int Total { get; private set; }
public int Average { get { return Count/Total; } }
public int AddDataPoint(int data)
{
Total += data;
Count++;
}
}
अब डबल, नाव और शायद अन्य वर्गों को परिभाषित ऑपरेटर + और ऑपरेटर के लिए है कि एक ही आपरेशन का समर्थन करने के लिए /, तो मेरा पहला विचार था बस जेनरिक उपयोग करने के लिए यह निर्धारित करें कि टी ऑपरेटरों का समर्थन करता है + और/इसलिए उपरोक्त स्निपेट को संकलित नहीं करता है। मेरा अगला विचार उन ऑपरेटरों का समर्थन करने वाले प्रकारों को टी को बाधित करना था, लेकिन मेरा प्रारंभिक शोध इंगित करता है कि यह नहीं किया जा सकता है।
यह निश्चित रूप से संभव है कि मैं उन वर्गों में से प्रत्येक बॉक्स को समर्थन देना चाहता हूं जो एक कस्टम इंटरफ़ेस लागू करता है उदा। IMath और उस पर टी को प्रतिबंधित करें, लेकिन इस कोड को कई बार बुलाया जाएगा और मैं मुक्केबाजी ओवरहेड से बचना चाहता हूं।
क्या कोड डुप्लिकेशन के बिना इसे हल करने का एक सुरुचिपूर्ण और कुशल तरीका है?
क्या आप केवल LINQ का उपयोग नहीं कर सकते? IENumerable पर योग और औसत समर्थित हैं। – Mathias
इस अन्य SO प्रश्न को देखें: http://stackoverflow.com/questions/32664/c-generic-constraint-for-only-integers – spinon
@Mathias: नहीं, मैंने इसे वास्तविक गणना के सरलीकृत उदाहरण के रूप में उपयोग किया। –