Zagłębiam się w generyczne i teraz mam sytuację, w której potrzebuję pomocy. Otrzymuję błąd kompilacji w poniższej klasie „Derived”, jak pokazano w tytule tematu. Widzę wiele innych postów podobnych do tego, ale nie widzę związku. Czy ktoś może mi powiedzieć, jak to rozwiązać?
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)
{
}
}
}
Odpowiedzi:
Nie mogę repro, ale podejrzewam, że w twoim kodzie jest jakieś ograniczenie, które
T : class
- na przykład, musisz rozpropagować to, aby uszczęśliwić kompilator (trudno powiedzieć na pewno bez przykładu repro):źródło
Ten błąd
T
pojawia się, jeśli ograniczyłeś się do byciaclass
źródło
Jeśli nałożysz ograniczenia na ogólną klasę lub metodę, każda inna generyczna klasa lub metoda, która jej używa, musi mieć „co najmniej” te ograniczenia.
źródło