2011-05-16 3 views
2

Так вот моя проблема:Generic проблема интерфейса

У меня есть интерфейс:

public interface ICell<Feature> 
where Feature: struct, IComparable<ICell<Feature>> 
{ 
    List<ICell<Feature>> Window { get; set; } 
    Feature    GenusFeature { get; set; } 
    Double    VitalityRatio { get; set; } 
    String    PopulationMarker { get; set; } 
    Boolean    Captured { get; set; } 
} 

И хотел реализовать ISubstratum интерфейс таким образом:

public interface ISubstratum<K,T> : IDisposable 
where K : IDisposable 
where T : struct 
{ 
    ICell<T> this[Int32 i, Int32 j] { get; set; } 
} 

Но компилятор говорит, что:

The type 'T' cannot be used as type parameter 'Feature' in the generic type or method 'Colorizer.Core.ICell<Feature>'. There is no boxing conversion or type parameter conversion from 'T' to 'System.IComparable<Colorizer.Core.ICell<T>>'.

В некоторых возможных ISubstratum реализации я планировал передать Bitmap как K & & ICell (удлинен инфо пикселей), как Т.

Как решить эту проблему?

Спасибо!

ответ

6

В основном вы должны иметь дополнительное ограничение на Т:

where T : struct, IComparable<ICell<T>> 

, то он должен работать нормально. Это необходимо для удовлетворения того же ограничения на Feature в ICell<Feature>.

Я также предлагаю вам переименовать параметр типа Feature в TFeature, чтобы сделать его более очевидным параметром типа.

+0

Хороший призыв к переименованию функции. Это на самом деле поймало меня сначала, когда я читал код. – Tim

+0

Спасибо! Теперь это строит отлично) – lexeme

1

Поскольку ваше ограничение на параметр типа T вашего типа ISubstratum не является достаточно конкретным. Оно должно быть:

where T : struct, IComparable<ICell<Feature>> 
1

Вы должны требовать T реализовать IComparable<ICell<T>>, как определено по определению типа ICell.

1

Это потому, что ваш T в ISubstratum<K,T> только ограничивается STRUCT, в то время как T в ICell<T> требуется также IComparable<ICell<T>>? Если вы добавите эту добавку, где она работает?

public interface ISubstratum<K,T> : IDisposable 
where K : IDisposable 
where T : struct, IComparable<ICell<T>> 
{ 
    ICell<T> this[Int32 i, Int32 j] { get; set; } 
} 

?

1
public interface ISubstratum<K,T> : IDisposable 
where K : IDisposable 
where T : struct, IComparable<ICell<Feature>> 
{ 
    ICell<T> this[Int32 i, Int32 j] { get; set; } 
} 
Смежные вопросы