2013-03-09 6 views
8
public interface PipelineElement<in TIn, out TOut> 
{ 
    IEnumerable<TOut> Run(IEnumerable<TIn> input, Action<Error> errorReporter); 
} 

public interface Stage 
{ 
} 

public abstract class PipelineElementBase<TIn, TOut> : PipelineElement<object, object>, 
    PipelineElement<TIn, TOut> where TIn : Stage where TOut : Stage 
{ 
    IEnumerable<object> PipelineElement<object, object>.Run(IEnumerable<object> input, Action<Error> errorReporter) 
    { 
     return this.Run(input.Cast<TIn>(), errorReporter).Cast<object>(); 
    } 

    public abstract IEnumerable<TOut> Run(IEnumerable<TIn> input, Action<Error> errorReporter); 
} 

object सही Stage लागू नहीं होता है, इसलिए न तो TIn है और न ही TOut कभी object हो सकता है? तो संकलक क्यों सोचता है कि PipelineElement<object, object> और PipelineElement<TIn, TOut> समान हो सकता है?इसका परिणाम CS0695 में क्यों होता है?

संपादित करें: हाँ, यह एक ही सामान्य इंटरफ़ेस कई बार लागू करने के लिए पूरी तरह से संभव है:

public interface MyInterface<A> { } 
public class MyClass: MyInterface<string>, MyInterface<int> { } 
+0

मैं अपने टिप्पणियों को निकाल दिया, मैं उपयोगी कुछ भी नहीं मिला है। पसंदीदा के रूप में चिह्नित, मैं भी जवाब जानना चाहता हूं :)। हालांकि सवाल के लिए +1! – bas

उत्तर

7

Compiler Error CS0695

से 'सामान्य प्रकार' दोनों 'जेनेरिक इंटरफेस' और 'सामान्य लागू नहीं कर सकते इंटरफेस 'क्योंकि वे कुछ प्रकार पैरामीटर प्रतिस्थापन के लिए एकजुट हो सकते हैं।

यह त्रुटि तब होती है जब एक सामान्य वर्ग में एक ही सामान्य इंटरफ़ेस के एक से अधिक parameterization लागू करता है, और एक प्रकार पैरामीटर प्रतिस्थापन जो दो इंटरफेस समान होगा वहां मौजूद। इस त्रुटि से बचने के लिए, इंटरफेस में से केवल एक को लागू करें, या संघर्ष से बचने के लिए प्रकार पैरामीटर बदलें।

आप अपने सार वर्ग में PipelineElementBase<TIn, TOut> और PipelineElement<object, object> इंटरफेस दोनों को लागू नहीं कर सकते हैं।

त्रुटि पृष्ठ के अनुसार, आपको चाहिए;

  • इनमें से केवल एक या
  • बदलें प्रकार पैरामीटर लागू संघर्ष से बचने के लिए। कार्यान्वित इंटरफेस

    इंटरफेस एक सामान्य प्रकार घोषणा द्वारा कार्यान्वित की

C# 5.0 Language Specification से

13.4.2 विशिष्टता सभी संभव निर्माण प्रकार के लिए अद्वितीय रहना चाहिए। इस नियम के बिना, कुछ निर्मित प्रकारों के लिए कॉल करने के लिए सही विधि निर्धारित करना असंभव होगा।

interface I<T> 
{ 
    void F(); 
} 
class X<U,V>: I<U>, I<V> 
{ 
    void I<U>.F() {...} 
    void I<V>.F() {...} 
} 

इस अनुमति दी गई है, यह निर्धारित करने के लिए को जो कोड निम्नलिखित मामले में निष्पादित असंभव होगा: उदाहरण के लिए, एक सामान्य वर्ग घोषणा लगता लिखे जाने की इस प्रकार की अनुमति थी

I<int> x = new X<int,int>(); 
x.F(); 

निर्धारित करने के लिए एक सामान्य प्रकार घोषणा के इंटरफेस सूची 0,123,516 हैवैध, निम्न चरणों का प्रदर्शन कर रहे हैं:

  • Let एल इंटरफेस सीधे एक सामान्य वर्ग में निर्दिष्ट की सूची हो, struct, या इंटरफ़ेस घोषणा सी

  • एल के किसी भी आधार इंटरफेस में जोड़े इंटरफेस पहले से ही एल

    में
  • एल से किसी भी डुप्लिकेट निकालें

  • तो किसी भी संभावित निर्माण सी से बनाया प्रकार होगा, के बाद प्रकार तर्क में प्रतिस्थापित कर रहे हैं एल, एल में दो इंटरफेस समान होने का कारण बनता है, फिर सी की घोषणा अमान्य है। प्रतिबंध सभी संभावित निर्मित प्रकारों का निर्धारण करते समय घोषणाओं पर विचार नहीं किया जाता है।

ऊपर वर्ग घोषणा X, इंटरफ़ेस सूची एल I<U> और I<V> के होते हैं। घोषणा अमान्य है क्योंकि U और V के साथ प्रकार का निर्माण एक ही प्रकार के होने के कारण इन दो इंटरफेस समान प्रकार के होते हैं।

यह अलग विरासत स्तरों पर निर्दिष्ट एकजुट करने के लिए इंटरफेस के लिए संभव है: भले ही Derived<U,V> दोनों I<U> और I<V> लागू करता

interface I<T> 
{ 
    void F(); 
} 
class Base<U>: I<U> 
{ 
    void I<U>.F() {…} 
} 
class Derived<U,V>: Base<U>, I<V> // Ok 
{ 
    void I<V>.F() {…} 
} 

इस कोड को मान्य है। कोड

I<int> x = new Derived<int,int>(); 
x.F(); 

, Derived में विधि का आह्वान Derived<int,int> के बाद से प्रभावी ढंग से फिर से लागू करता I<int> (§13.4.6)।

[अतः संपादक द्वारा जोर।]

+0

कौन सा संघर्ष? उन प्रकार की बाधाओं के साथ, '' और '<ऑब्जेक्ट, ऑब्जेक्ट> 'टकरा नहीं सकता है। –

+5

@ मुख्य - "सभी संभव निर्मित प्रकारों का निर्धारण करते समय सीमित घोषणाओं पर विचार नहीं किया जाता है।" यह आपकी समस्या का लिंचपिन है, लेकिन यह जवाब उस महत्वपूर्ण वाक्य को आईएमएचओ के बारे में बहुत अधिक जानकारी देता है। –

संबंधित मुद्दे