सामान्य प्रकार या विधि में पैरामीटर 'टी' के रूप में इसका उपयोग करने के लिए प्रकार एक संदर्भ प्रकार होना चाहिए


211

मैं जेनरिक में गहरी हो रही हूं और अब एक स्थिति है जिसकी मुझे मदद की जरूरत है। मुझे विषय शीर्षक में दिखाए गए अनुसार नीचे दिए गए 'व्युत्पन्न' वर्ग पर एक संकलन त्रुटि मिलती है। मैं इस एक के समान कई अन्य पोस्ट देख रहा हूं लेकिन मैं संबंध नहीं देख रहा हूं। क्या कोई मुझे बता सकता है कि इसे कैसे हल किया जाए?

using System;
using System.Collections.Generic;


namespace Example
{
    public class ViewContext
    {
        ViewContext() { }
    }

    public interface IModel
    {
    }

    public interface IView<T> where T : IModel 
    {
        ViewContext ViewContext { get; set; }
    }

    public class SomeModel : IModel
    {
        public SomeModel() { }
        public int ID { get; set; }
    }

    public class Base<T> where T : IModel
    {

        public Base(IView<T> view)
        {
        }
    }

    public class Derived<SomeModel> : Base<SomeModel> where SomeModel : IModel
    {

        public Derived(IView<SomeModel> view)
            : base(view)
        {
            SomeModel m = (SomeModel)Activator.CreateInstance(typeof(SomeModel));
            Service<SomeModel> s = new Service<SomeModel>();
            s.Work(m);
        }
    }

    public class Service<SomeModel> where SomeModel : IModel
    {
        public Service()
        {
        }

        public void Work(SomeModel m)
        {

        }
    }
}

मुझे कोई संकलन त्रुटियां नहीं
मिलीं

यह कोड उस त्रुटि को नहीं दिखाता है। सफाई से संकलन करता है।
मार्क ग्रेवेल

जवाबों:


474

मैं रेप्रो नहीं कर सकता, लेकिन मुझे संदेह है कि आपके वास्तविक कोड में कहीं न कहीं एक अड़चन है कि T : class- आपको यह प्रचारित करने की आवश्यकता है कि कंपाइलर को खुश करने के लिए, उदाहरण के लिए (रेप्रो उदाहरण के बिना यकीन के लिए कहना कठिन है):

public class Derived<SomeModel> : Base<SomeModel> where SomeModel : class, IModel
                                                                    ^^^^^
                                                                 see this bit

12
धन्यवाद, हाँ, यह बात है। एक बार जब मैंने क्लास की बाधा को जोड़ा तो कंपाइल एरर दूर हो गया। निम्न रेफरेंस प्रकार की आवश्यकता को पूरा करता है।
क्रिस

यहाँ क्या काम करता है। सार्वजनिक वर्ग का आधार <T> जहाँ T: वर्ग, IModel {सार्वजनिक आधार (IView <T> दृश्य) {}} सार्वजनिक वर्ग व्युत्पन्न <SomeModel>: Base <SomeModel> जहाँ SomeModel: वर्ग, IModel {सार्वजनिक व्युत्पन्न (IView <SomeModel) दृश्य): आधार (दृश्य) {SomeModel m = (SomeModel) Activator.CreateInstance (टाइपोफ़ (SomeModel)); सेवा <someModel> s = नई सेवा <SomeModel> (); s.Work (एम); }}
क्रिस एसएन

के रूप में अच्छी तरह से मदद की :) धन्यवाद :) एक साइड नोट के रूप में, मुझे लगता है कि हमें एक ही बाधा को बार-बार कॉपी नहीं करना चाहिए अगर यह पहले से ही इंटरफ़ेस, आईएमओ में लागू होता है।
Celdor

46

यदि आप Tएक होने के लिए विवश हैं तो आपको यह त्रुटि मिलती हैclass


9

यदि आप एक सामान्य वर्ग या विधि पर बाधा डालते हैं, तो प्रत्येक अन्य सामान्य वर्ग या विधि जो इसका उपयोग कर रही है, उन बाधाओं को "कम से कम" होने की आवश्यकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.