2011-12-19 11 views
7

मैं इस सामान्य निर्दिष्ट करने के लिए कोशिश की, लेकिन मैं कई त्रुटियाँ हो रही है:एक जेनेरिक को कहां से निर्दिष्ट करें?

public void AddOrUpdate(T item, V repo) where T: IAuditableTable, V: IAzureTable<TableServiceEntity> 
    { 
     try 
     { 
      V.AddOrUpdate(item); 
     } 
     catch (Exception ex) 
     { 
      _ex.Errors.Add("", "Error when adding account"); 
      throw _ex; 
     } 
    } 

उदाहरण के लिए ":":

Error 3 ; expected 

प्लस अन्य त्रुटियों सिर्फ पहली पंक्ति पर वी के बाद एक त्रुटि देता है :

Error 2 Constraints are not allowed on non-generic declarations 
Error 6 Invalid token ')' in class, struct, or interface member declaration 
Error 5 Invalid token '(' in class, struct, or interface member declaration 
Error 7 A namespace cannot directly contain members such as fields or methods 
Error 8 Type or namespace definition, or end-of-file expected 

क्या मेरे जेनेरिक कोडिंग के साथ कुछ स्पष्ट रूप से गलत है?

अद्यतन:

मैं अब परिवर्तन और कोड बना इस तरह दिखता है:

public void AddOrUpdate<T, V>(T item, V repo) 
     where T : Microsoft.WindowsAzure.StorageClient.TableServiceEntity 
     where V : IAzureTable<TableServiceEntity> 
    { 
     try 
     { 
      repo.AddOrUpdate(item); 
     } 
     catch (Exception ex) 
     { 
      _ex.Errors.Add("", "Error when adding account"); 
      throw _ex; 
     } 
    } 

व्युत्पन्न वर्ग से यह कॉलिंग:

public void AddOrUpdate(Account account) 
    { 
     base.AddOrUpdate<Account, IAzureTable<Account>>(account, _accountRepository); 
    } 
+6

आप शायद 'फेंक चाहिए,' यहां बल्कि 'से फेंक पूर्व;'। अन्यथा आप मूल स्टैक ट्रेस को टॉस देंगे। –

उत्तर

12

आप एक दूसरी where के लिए की जरूरत है V:

public void AddOrUpdate<T, V>(T item, V repo) 
    where T : IAuditableTable 
    where V : IAzureTable<TableServiceEntity> 

प्रत्येक where एक प्रकार के पैरामीटर के लिए बाधाओं को सूचीबद्ध करता है। ध्यान दें कि मैंने विधि में टाइप पैरामीटर भी जोड़े हैं - अन्यथा संकलक T और V को सामान्य प्रकार के रूप में देखेगा, और यह समझ में नहीं आता कि आप उन्हें बाधित करने का प्रयास क्यों कर रहे थे।

+0

धन्यवाद जॉन। यह मुझे सुझाई गई विधि से बहुत अलग है। मैं अब कोशिश करूँगा। –

+0

अब मैं 8 त्रुटियों से "V.AddOrUpdate (आइटम)" पर इंगित करने वाली एक त्रुटि से नीचे चला गया हूं और कह रहा हूं: त्रुटि 'वी' एक 'प्रकार पैरामीटर' है, जो दिए गए संदर्भ में मान्य नहीं है –

+0

@ समन्थाज: ठीक है, और यही वह जगह है जहां जामिक का जवाब उपयुक्त है ... जब तक कि आप एक * स्थिर * विधि को कॉल करने की कोशिश नहीं कर रहे थे, जो अभी काम नहीं करता है। –

5

कुछ चीजें गलत लगती हैं।

1) के रूप में @Jon ने कहा, आप की जरूरत अलग where खंड

2) आप विधि पर जेनरिक परिभाषित करने की जरूरत:

public void AddOrUpdate<T,V>(T item, V repo) where .... 

3) आप पर एक विधि कॉल करने के प्रयास कर रहे हैं टाइप करें V इस प्रकार का उदाहरण repo नहीं है। यानी, इस:

V.AddOrUpdate(item); 

होना चाहिए

repo.AddOrUpdate(item); 
संबंधित मुद्दे