परिचय बिना एकाधिक == ऑपरेटर भार के:
मैं कुछ वर्ग है जो एक ही काम करते हैं, लेकिन अलग अलग मूल्य प्रकार के साथ (तैरता या पूर्णांक जैसे वाहक)।
अब मैं समानता की जांच करने में सक्षम होना चाहता हूं, इस समानता को प्रकारों (जैसे वेक्टरएफ == वेक्टरआई) के बीच भी काम करना चाहिए।
इसके अलावा, यह एक शून्य जांच (vectorF == शून्य) करना संभव होना चाहिए।सी #, अस्पष्ट अशक्त जांच
दृष्टिकोण:
मेरे दृष्टिकोण == और के लिए कई भार के बनाने के लिए है = ऑपरेटरों, प्रत्येक संभव संयोजन के लिए एक!।
public sealed class VectorF
{
[...]
public static bool operator == (VectorF left, VectorI right)
{
// Implementation...
}
public static bool operator == (VectorF left, VectorF right)
{
// Implementation...
}
// Same for != operator
[...]
}
समस्या:
कई भार के का उपयोग करना, मैं सिर्फ == ऑपरेटर के साथ एक अशक्त जाँच नहीं कर सकते, के रूप में कॉल अस्पष्ट होगा।
var v = new VectorF([...]);
if (v == null) // This call is ambiguous
[...]
मैं संभावना बजाय एक ReferenceEquals या नल कास्टिंग का उपयोग करने के बारे में पता कर रहा हूँ, लेकिन यह मेरे लिए एक गंभीर प्रतिबंध approachis।
var v = new VectorF([...]);
if(object.ReferenceEquals(v, null)) // Would work, is not user friendly.
[...]
if(v == (VectorF)null) // Would also work, is neither user friendly.
[...]
प्रश्न:
वहाँ एक रास्ता में == ऑपरेटर लागू करने के लिए एक रास्ता है, यह आसान अशक्त जांच की अनुमति देता है कि, और विभिन्न वैक्टर के बीच समानता की जांच के लिए अनुमति देता है?
वैकल्पिक रूप से, क्या कोई और तरीका है कि मैं इसे कैसे कार्यान्वित कर सकता/सकती हूं?
ऐसा लगता है कि आपके वेक्टर वर्ग वास्तव में अपरिवर्तनीय structs होना चाहिए। फिर 'शून्य' का मुद्दा नहीं उठता है। (मुझे लगता है कि आपकी कक्षाओं में केवल 2 या 3 मान हैं।) –
लगता है जैसे [zugzwang] (https://en.wikipedia.org/wiki/Zugzwang): या तो अच्छी लग रही है '==' या '== शून्य '। अन्य प्रकार के वेक्टर के साथ तुलना करने के तरीकों के बारे में कैसे? जैसे 'VectorF।IsSame (वेक्टर I) '? जब वह 'vectorF == vectorI' की कोशिश करता है तो संकलक उपयोगकर्ता गलती दिखाएगा और फिर उपयोगकर्ता तुलना करने के तरीकों की खोज करेगा, tada, समस्या हल हो जाएगी? एक और बात: 'int' के साथ 'फ्लोट' की तुलना करना सटीक नहीं होगा, 'वेक्टर' को पहले 'वेक्टर I' में कास्टिंग करने के बारे में और फिर दो 'वेक्टर I' की तुलना कैसे करें? – Sinatr
आपको बाएं-दाएं ओवरलोड की आवश्यकता क्यों है .. क्या आप हमें ओवरलोड विधियों की सामग्री साझा कर सकते हैं .. – levent