public abstract class EntityBase { ... }
public interface IFoobar
{
void Foo<T>(int x)
where T : EntityBase, new();
}
public interface IFoobar<T>
where T : EntityBase, new()
{
void Foo(int x);
}
public class Foobar<T> : IFoobar, IFoobar<T>
where T : EntityBase, new()
{
public void Foo(int x) { ... }
void IFoobar.Foo<T>(int x) { Foo(x); }
}
dostaję ostrzeżenie kompilatora: Type parameter 'T' has the same name as the type parameter from outer type '...'
Typ parametru „T” ma taką samą nazwę jak parametr typu od rodzaju zewnętrznego „...”
próbowałem robić: void IFoobar.Foo<U>(int x) { Foo(x); }
, jednak wtedy nie mogę gwarantują, że U i T są takie same. Sposób, w jaki realizowana jest klasa Foobar, jest bardzo ważny, aby były takie same.
Próbowałem również: void IFoobar.Foo<U>(int x) where U : T { Foo(x); }
, ale to nie gwarantuje, że U i T są równe i nie pozwala mi to przedefiniować ograniczenia, ponieważ został zdefiniowany na interfejsie.
Co próbujesz zrobić? Dlaczego ponownie definiujesz T, jeśli jest on określony w klasie? Jeśli masz potrzebę zdefiniowania go, to powinno być oddzielne, w przeciwnym razie klasa T jest już określona przez klasę. Jeśli chcesz rozwiązać ten problem, umieść T na interfejsie, jeśli możesz. Właśnie to zrobiłem, gdy znajdę się w duplikacie specyfikacji typu. –