मैंने सामान्य एक्सटेंशन विधियों को रखने के लिए एक अलग असेंबली बनाई है, एक्सटेंशन विधियां System.Web.dll
(और अन्य) से कक्षाओं का उपयोग करती हैं।एक अलग असेंबली में बाधित जेनेरिक एक्सटेंशन विधियों का उपयोग एक संदर्भ त्रुटि
जब मैं तो एक नई परियोजना (कंसोल आवेदन) का संदर्भ देता है Utilities.dll
विधानसभा कि विस्तार के तरीकों में शामिल है बनाने के लिए, मैं नई परियोजना के लिए System.Web.dll
के लिए एक संदर्भ जोड़ने के लिए अगर यह विस्तार तरीकों कि फैली उपयोग नहीं करता है की जरूरत नहीं है System.Web.dll
असेंबली में कोई भी वर्ग (उदाहरण के लिए System.Web.UI.Control
)।
जब एक्सटेंशन विधियों में से एक एक सामान्य विधि होगी, तो सबकुछ अपेक्षित काम करेगा। लेकिन जैसे ही मैं जेनेरिक विधि में बाधा डालता हूं जो इसे System.Web.dll
असेंबली में कक्षा में जोड़ता है, संकलक शिकायत करेगा कि मेरी नई परियोजना (कंसोल एप्लिकेशन) को System.Web.dll
के संदर्भ की आवश्यकता है, भले ही नई परियोजना अभी भी कुछ भी उपयोग नहीं कर रही है वह सभा
दूसरे शब्दों में जब तक मेरे सामान्य तरीकों पर बाधा न हो, तब तक सब कुछ संकलित हो जाता है लेकिन जैसे ही मैं संक्रामक शिकायत करता हूं।
static void Main(string[] args)
{
bool isEmpty = "Hello World!".IsNullOrEmpty();
Console.ReadLine();
}
अपडेट:: मार्क के रूप में (नीचे) ने बताया एक अलग नाम स्थान में उल्लंघन करने विधि डाल ठीक करता है
अपने एक्सटेंशन तरीकों का एक उदाहरण (एक पुस्तकालय Utilities.dll
):
public static class StringExtensions
{
public static bool IsNullOrEmpty(this string value)
{
return string.IsNullOrEmpty(value);
}
}
public static class ControlExtensions
{
// If I remove the where clause it compiles
public static T FildChild<T>(this Control parent, string id)
where T : Control
{
throw new NotImplementedException();
}
}
And here is a new console application that won't compile (unless I also add a reference to System.Web.dll
के रूप में संकलित) इकट्ठा मुसीबत।
निर्देश का उपयोग कर उपयोग करता हूं।लेकिन सवाल अभी भी बनी हुई है कि बाधा एक समस्या क्यों है जबकि प्रकार
विधि के पैरामीटर के रूप में पहले से ही उपयोग किया गया था। और नेमस्पेस समाधान क्यों है जब मैं पहले से ही शीर्ष पर
मुझे यकीन नहीं है कि मैं पूरी तरह से समझता हूं। 1) मेरी परियोजना उस प्रकार का उपयोग नहीं कर रही है। 2) विस्तार विधि पहले से ही विधि के पहले तर्क में टाइप का उपयोग करती है तो बाधा इस पागलपन को क्यों ट्रिगर करती है? – Yona
मुझे नहीं लगता कि यह सवाल का जवाब देता है। जब कोड को पैरामीटर प्रकार के रूप में संदर्भित किया जाता है तब भी उसका कोड ठीक संकलित होता है, लेकिन यदि वह इसे एक ही विधि * के रूप में एक बाधा के रूप में नहीं जोड़ता है। वह नियंत्रण एक्सटेंशन वर्ग का भी संदर्भ नहीं दे रहा है। –
आश्चर्यजनक रूप से अपमानजनक विधि को एक अलग नामस्थान में रखकर (किसी भी नाम के साथ जब तक यह अन्य एक्सटेंशन के साथ नहीं है) समस्या को हल करता है। सबसे अच्छा अजीब। – Yona