2012-09-07 14 views
13

के बीच अस्पष्टता मेरे वर्ग में दो आइटम हैं: एक सार्वजनिक संपत्ति है, और दूसरा एक स्थिर विधि है जो पैरामीटर लेता है।स्टेटिक और इंस्टेंस कोड

मुझे वास्तव में समझ में नहीं आता कि क्यों विजुअल स्टूडियो 2010 इन दो वस्तुओं के बीच अंतर देखने में असमर्थ है।

क्या कोई मुझे यह समझा सकता है?

public bool IsShipped { 
    get { 
    #region ' Test Code ' 
    if (!String.IsNullOrEmpty(TrailerNo) || (TruckDate != Global.NODATE)) { 
     return true; 
    } 
    #endregion 
    return false; 
    } 
} 

public static bool IsShipped(string boxNumber) { 
    var array = GetCrate(boxNumber); 
    if (array != null) { 
    foreach (var item in array) { 
     if (item.IsShipped) { 
     return true; 
     } 
    } 
    } 
    return false; 
} 

यहाँ त्रुटि है::

यहाँ कोड है

Error 1 Ambiguity between 'AcpClasses.AcpPackNShip.IsShipped' and 'AcpClasses.AcpPackNShip.IsShipped(string)' C:\Users\cp-jpool\My Projects\VS\Live\Common\Classes\AcpPackShip.cs 242 20 CoilPC

screenshot

उत्तर

10

यह एक प्रतिनिधि के रूप में एक विधि का उल्लेख करने के लिए, बस नहीं यह फोन करके संभव है।

Func<string, bool> myFunction = item.IsShipped; 

यह देखते हुए कि विधि वास्तव में कोष्ठक के साथ कहा जा की जरूरत नहीं है, वहाँ अगर item.IsShipped का उल्लेख माना जाता है का निर्धारण करने का कोई तरीका नहीं है: उदाहरण के लिए, निम्नलिखित विधि के मान्य उपयोग किया जाएगा सकता है IsShipped के लिए विधि समूह या IsShipped संपत्ति होने के लिए।

भले ही की अनुमति दी गई हो, तो यह भ्रम के परिणामस्वरूप होने की संभावना होगी। यह एक कोड रखरखाव परिप्रेक्ष्य से संपत्ति/विधि के लिए अलग-अलग नाम रखने के लिए बेहतर होगा, भले ही कंपाइलर किसी भी तरह से समझने के लिए पर्याप्त समझ सके कि कौन सा उपयोग करना है (या बदतर, अगर यह सिर्फ मनमाने ढंग से उठाया गया हो)।

8

आप अलग अलग तरीकों हस्ताक्षरों के साथ ओवरलोड कर सकते हैं, लेकिन आप कोई स्थान नहीं दिया जा सकता है या एक विधि के रूप में एक ही नाम के साथ संपत्ति।

ऐसा इसलिए है क्योंकि किसी विधि का कच्चा नाम एक प्रतिनिधि समूह का मूल्यांकन करता है, जो प्रतिनिधि बनाते समय उपयोग किया जाता है।

कोड का यह टुकड़ा स्पष्ट रूप से समस्या को दिखाता है:

bool b = item.IsShipped; 
Func<string, bool> d = item.IsShipped; 
संबंधित मुद्दे