Loại phải là loại tham chiếu để sử dụng nó làm tham số 'T' trong loại hoặc phương thức chung


211

Tôi đang tìm hiểu sâu hơn về thuốc generic và bây giờ có một tình huống tôi cần giúp đỡ. Tôi nhận được một lỗi biên dịch trên lớp 'Derogen' bên dưới như thể hiện trong tiêu đề chủ đề. Tôi thấy nhiều bài viết khác tương tự như bài này nhưng tôi không thấy mối quan hệ. Ai đó có thể cho tôi biết làm thế nào để giải quyết điều này?

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

        }
    }
}

Tôi không nhận được bất kỳ lỗi biên dịch nào
Vince Panuccio

Mã này không hiển thị lỗi đó. Biên dịch sạch sẽ.
Marc Gravell

Câu trả lời:


474

Tôi không thể repro, nhưng tôi nghi ngờ rằng trong mã thực tế của bạn có một ràng buộc ở đâu đó T : class- bạn cần tuyên truyền điều đó để làm cho trình biên dịch hài lòng, ví dụ (khó có thể nói chắc chắn nếu không có ví dụ repro):

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

12
Cảm ơn bạn, vâng đó là nó. Khi tôi thêm các ràng buộc lớp, lỗi biên dịch đã biến mất. Sau đây dường như để đáp ứng nhu cầu cho loại refernce.
ChrisS

đây là những gì hoạt động. lớp công khai Cơ sở <T> trong đó T: class, IModel {công khai view): base (view) {someModel m = (someModel) Activator.CreateInstance (typeof (someModel)); Dịch vụ <someModel> s = dịch vụ mới <someModel> (); s.Work (m); }}
ChrisS

Cũng được giúp đỡ :) Cảm ơn :) Như một lưu ý phụ, tôi nghĩ rằng chúng ta không nên sao chép cùng một lần nữa nếu nó đã được áp dụng trong giao diện, IMO.
Celdor

46

Bạn gặp lỗi này nếu bạn bị hạn chế Tclass


9

Nếu bạn đặt các ràng buộc trên một lớp hoặc phương thức chung, thì mỗi lớp hoặc phương thức chung khác đang sử dụng nó cần phải có "ít nhất" các ràng buộc đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.