Метод расширения возвращает InvalidCastException

Я пытаюсь научиться использовать методы расширения и создал свои собственные. Теперь я попытался запустить свой код, но Visual Studio выдал ошибку, что у меня возникла необработанная исключительная ситуация InvalidCastException, поэтому я обработал ее и попытался запустить.

Мне пришлось вернуть null в блоке catch, поэтому у меня было еще одно необработанное исключение, которое также было напечатано.

Теперь, когда я пытаюсь запустить этот код, я вывод

InvalidCastException NullReferenceException

Универсальный метод преобразования throw InvalidCastException Попробовал решение, найденное здесь, добавив (динамический) к приведению, тот же результат.

Обратите внимание, у меня есть Java-фон, а не C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication4
{

class Program
{
    static void Main(string[] args)
    {
        Reeks r = new Reeks();
        IEnumerable<int> selectie = r.TakeRange(10, 1000);
        try
        {
            foreach (int i in selectie)
            {
                Console.WriteLine("selectie: {0}", i);
            }
        }
        catch (NullReferenceException)
        {
            Console.WriteLine("NullReferenceException");
        }
        Console.ReadLine();

    }
}

static class MyExtension
{
    public static Reeks TakeRange(this Reeks r, int start, int end)
    {
        try
        {
            return (Reeks)r.Where(i => i > start && i < end);
        }
        catch (InvalidCastException) { 
            Console.WriteLine("InvalidCast"); return null; 
        }
    }
}


public class Reeks : IEnumerable<int>
{

    public Reeks()
    {

    }

    public IEnumerator<int> GetEnumerator()
    {
        int start = 2;
        yield return start;
        for (; ; )
        {
            int nieuw = start * 2;
            yield return nieuw;
            start = nieuw;

        }

    }

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        return this.GetEnumerator();
    }


}


}

3 ответа

Решение

Вы должны изменить свой статический метод, чтобы он возвращал IEnumerable <int>, Взгляни на это:

static class MyReeksExtension {
        public static IEnumerable <int> TakeRange(this IEnumerable<int> r, int start, int end) {
            return r.Where(i => i > start && i < end);
        }
    }

Убедитесь, что ваш 'selectie' также относится к этому типу:

IEnumerable<int> selectie = r.TakeRange(10, 1000);

        foreach (int n in selectie)
            Console.Write("{0}; ", n);

Нет проблем, мне тоже пришлось искать помощь:P

Вы применяете возвращаемое значение Where позвонить в try блок для ввода Reeks:

return (Reeks)r.Where(i => i > start && i < end);

Тем не менее, нигде нет метода, вызываемого Where который на самом деле возвращает объект типа Reeks, Этот код вызывает Enumerable.Where, который возвращает какой-то IEnumerable реализация, но определенно не ваш собственный тип.

Вы должны либо реализовать новый (расширение или экземпляр) метод с именем Where это можно назвать на Reeks объект, а также возвращает Reeks объект. Или вы могли бы просто принять тот факт, что Where не возвращает Reeks и просто ожидать IEnumerable<int> вместо.

Вы должны изменить следующую строку return (Reeks)r.Where(i => i > start && i < end);в return (Reeks)(r.Where(i => i > start && i < end).ToList().AsEnumerable());

Предложение where возвращает перечислитель, который должен быть преобразован в список. Кроме того, вы можете попробовать skip а также take в linq для замены к фрагменту кода выше.

Другие вопросы по тегам