제네릭 형식이나 메서드에서 매개 변수 'T'로 사용하려면 형식이 참조 형식이어야합니다.


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

        }
    }
}

컴파일 오류가 발생하지 않습니다
Vince Panuccio

이 코드는 해당 오류를 표시하지 않습니다. 깨끗하게 컴파일합니다.
Marc Gravell

답변:


474

나는 생식,하지만 난 할 수 의심 실제 코드에있는 제약 곳이 있음 T : class- 당신은 (A 생식 예를하지 않고 확실히 말할 하드) 예를 들어, 컴파일러 행복을 만들기 위해 그 내용을 전파 할 필요가 :

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

12
고마워, 그래. 클래스 제약 조건을 추가하면 컴파일 오류가 사라졌습니다. 다음은 참조 유형의 필요성을 충족시키는 것 같습니다.
ChrisS

여기에 효과가 있습니다. 공용 클래스 Base <T> 여기서 T : 클래스, IModel {public Base (IView <T>보기) {}} 공용 클래스 Derived <SomeModel> : Base <SomeModel> 여기서 SomeModel : 클래스, IModel {public Derived (IView <SomeModel> view) : base (view) {SomeModel m = (SomeModel) Activator.CreateInstance (typeof (SomeModel)); Service <SomeModel> s = 새 서비스 <SomeModel> (); s. 워크 (m); }}
ChrisS

또한 도움이되었습니다 :) 감사합니다 :) 부수적으로, 같은 constrait가 인터페이스 IMO에 이미 적용되어 있다면 반복적으로 복사하지 않아야한다고 생각합니다.
Celdor

46

당신이 제한 T되어 있다면이 오류가 발생합니다class


9

제네릭 클래스 또는 메서드에 제약 조건을 적용하는 경우이 클래스를 사용하는 다른 모든 일반 클래스 또는 메서드에는 "적어도"해당 제약 조건이 있어야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.