জেনেরিক টাইপ বা পদ্ধতিতে প্যারামিটার 'টি' হিসাবে এটি ব্যবহার করতে টাইপটি অবশ্যই একটি রেফারেন্স টাইপ হতে হবে


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)
        {

        }
    }
}

আমি কোনও সংকলন ত্রুটি পাই না
ভিন্স পানুসিও

এই কোডটি ত্রুটিটি দেখায় না। পরিষ্কারভাবে সংকলন।
মার্ক Gravell

উত্তর:


474

আমি তিরস্কার করতে পারি না, তবে আমার সন্দেহ হয় যে আপনার আসল কোডে কোথাও কোথাও বাধা রয়েছে T : class- সংকলককে খুশি করার জন্য আপনাকে এটি প্রচার করতে হবে, উদাহরণস্বরূপ (কোনও রেপো উদাহরণ ছাড়াই নিশ্চিত করে বলা শক্ত):

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

12
আপনাকে ধন্যবাদ, হ্যাঁ এটিই আমি যখন ক্লাস বাধা যুক্ত করলাম তখন সংকলনের ত্রুটিটি চলে গেল। নিম্নলিখিতটি রেফারেন্স ধরণের প্রয়োজনের জন্য সন্তুষ্ট বলে মনে হচ্ছে।
ক্রিসএস

এখানে কি কাজ করে। পাবলিক ক্লাস বেজ <T> যেখানে টি: শ্রেণি, আইমোডেল {পাবলিক বেস (আইভিউ <টি> ভিউ) {}} পাবলিক ক্লাস ডেরিভড <সোমো মডেল>: বেস <সোমমোডেল> যেখানে সামমোডেল: ক্লাস, আইমোডেল {পাবলিক ডারাইভড (আইভিউ <সোমো মডেল> ভিউ): বেস (ভিউ) {সোমারমোডেল এম = (সামোডেল) অ্যাক্টিভেটর.ক্রেইটইনস্ট্যান্স (টাইপফ (সামোমডেল)); পরিষেবা <সোমো মডেল> এস = নতুন পরিষেবা <সোমো মডেল> (); s.Work (মি); }}
ক্রিসএস

পাশাপাশি সহায়তা করেছে :) ধন্যবাদ :) একটি পার্শ্ব নোট হিসাবে, আমি মনে করি এটি ইতিমধ্যে ইন্টারফেসে প্রয়োগ করা থাকলে আমাদের একই প্রতিবন্ধকতাটি বার বার অনুলিপি করা উচিত নয়, আইএমও।
Celdor

46

আপনি যদি Tএকজন হওয়ার সীমাবদ্ধ থাকেন তবে আপনি এই ত্রুটিটি পানclass


9

আপনি যদি জেনেরিক ক্লাস বা পদ্ধতিতে প্রতিবন্ধকতা রাখেন তবে এটি ব্যবহার করা প্রতিটি অন্যান্য জেনেরিক শ্রেণি বা পদ্ধতিতে "কমপক্ষে" সেই সীমাবদ্ধতা থাকা দরকার।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.