Из вашего кода вам нужно вернуть хотя бы один из них, а затем вернуть true, когда все в порядке.
** также нужно работать только до (длина -1)
for (int i=0; i<len-1; i++)
{
if ( sArr[i] > sArr[i+1])
{
return false;
cout<<"notOrdered"<<endl;
}
}
cout<<"isOrdered"<<endl;
return true;
У Eric Lippert, который работает над языком, есть ряд сообщений на MSDN, который должен помочь разъяснить включенные проблемы:
http://blogs.msdn.com/ericlippert/archive/tags/Covariance+and+Contravariance/default.aspx
При чтении статей, показанных в той ссылке, запустите внизу и обработайте.
В конечном счете Вы доберетесь до #7 (Почему нам нужен синтаксис вообще?) .
Мы не делаем на самом деле потребность их, больше затем нам нужно abstract
на классах или и out
и ref
. Они существуют именно так, что мы, как программисты, можем сделать наше намерение совершенно прозрачным, так, чтобы программист обслуживания знал то, что мы делаем, и компилятор может проверить, что мы делаем его правильно.
Ну, основная проблема - это, если у Вас есть иерархия классов как:
class Foo { .. }
class Bar : Foo { .. }
И Вы имеете IEnumerator<Bar>
, Вы не можете использовать это в качестве IEnumerator<Foo>
даже при том, что это было бы совершенно безопасно. В 3,5 это вызывает большое количество болезненных циркуляций. Эта работа всегда была бы безопасна, но отклонена системой типов, потому что она не знает о ковариантном использовании универсального параметра типа. IEnumerator<Bar>
может только возвратиться Bar
, и каждый Bar
Foo
.
Точно так же, если Вы имели IEqualityComparer<Foo>
, это может использоваться для сравнения любой пары объектов типа Foo
, даже если один или оба Bar
, но это не может быть брошено в IEqualityComparer<Bar>
, потому что это не знает о контравариантном использовании универсального параметра типа. IEqualityComparer<Foo>
только использует объекты типа Foo
, и каждый Bar
Foo
.
Без этих ключевых слов мы вынуждены предположить, что универсальный аргумент может произойти и как аргумент методу и как тип результата метода, и таким образом, мы не можем безопасно позволить ни одно из вышеупомянутых преобразований.
С ними, система типов свободна позволить нам безопасно восходящему и удрученному между теми интерфейсами в направлении, обозначенном ключевым словом, и мы получаем ошибки, указывающие, когда мы нарушили бы дисциплину, требуемую обеспечить ту безопасность.
in
и out
ключевые слова были ключевыми словами начиная с C# 1.0 и использовались в контексте in
- и out
- параметры к методам.
Ковариантность и контравариантность являются ограничениями на то, как можно реализовать интерфейс. Нет никакого хорошего способа вывести их - единственный путь, я думаю, от использования, и это было бы грязно, и в конце это не будет работать.
Jon и Joel оба предоставили довольно полный ответ на это, но нижняя строка - то, что они не так , нуждался компилятором, а скорее справка гарантируют безопасность реализации путем явного указания на различие параметра. Это следует за очень похожим шаблоном к требованию out
или ref
ключевое слово и на сайте вызова и на сайте объявления.