मैं सी # में जेनेरिक एल्गोरिदम लिखने की कोशिश कर रहा हूं जो विभिन्न आयामों की ज्यामितीय संस्थाओं के साथ काम कर सकता है।
निम्नलिखित आकस्मिक उदाहरण में मेरे पास है Point2
और Point3
, दोनों एक सरल IPoint
इंटरफ़ेस को लागू कर रहे हैं ।
अब मेरे पास एक फ़ंक्शन है GenericAlgorithm
जो एक फ़ंक्शन को कॉल करता है GetDim
। प्रकार के आधार पर इस फ़ंक्शन की कई परिभाषाएं हैं। एक फॉल-बैक फ़ंक्शन भी है जो किसी भी चीज के लिए परिभाषित किया गया है जो लागू होता है IPoint
।
मुझे शुरू में उम्मीद थी कि निम्न प्रोग्राम का आउटपुट 2, 3 होगा। हालाँकि, यह 0, 0 है।
interface IPoint {
public int NumDims { get; }
}
public struct Point2 : IPoint {
public int NumDims => 2;
}
public struct Point3 : IPoint {
public int NumDims => 3;
}
class Program
{
static int GetDim<T>(T point) where T: IPoint => 0;
static int GetDim(Point2 point) => point.NumDims;
static int GetDim(Point3 point) => point.NumDims;
static int GenericAlgorithm<T>(T point) where T : IPoint => GetDim(point);
static void Main(string[] args)
{
Point2 p2;
Point3 p3;
int d1 = GenericAlgorithm(p2);
int d2 = GenericAlgorithm(p3);
Console.WriteLine("{0:d}", d1); // returns 0 !!
Console.WriteLine("{0:d}", d2); // returns 0 !!
}
}
ठीक है, इसलिए किसी कारण से ठोस प्रकार की जानकारी खो जाती है GenericAlgorithm
। मुझे पूरी तरह से समझ में नहीं आता कि ऐसा क्यों होता है, लेकिन ठीक है। अगर मैं इसे इस तरह से नहीं कर सकता, तो मेरे पास और क्या विकल्प हैं?
GetDim
(यानी मैं पास नहीं होता है, Point4
लेकिन फॉल बैक फंक्शन आवश्यक है GetDim<Point4>
। हालाँकि, ऐसा प्रतीत नहीं होता है कि संकलक किसी विशेष कार्यान्वयन के लिए परेशान हैं।
NumDims
संपत्ति उपलब्ध है। आप कुछ मामलों में इसकी अनदेखी क्यों कर रहे हैं?