2016-02-28 3 views
-1

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

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

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

InvalidCastException NullReferenceException

Generic conversion method 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(); 
    } 


} 


} 
+0

На какой линии? Вы отлаживали свой код? –

+0

На обоих телах-попытках, начинающихся с 'return (Reeks) r.Where (i => i> start && i Ivaro18

+1

Тип 'reeks.Where 'больше не' Reeks'. 'Reeks'' 'IEnumerable ', но каждый 'IEnumerable ' не 'Reeks'. –

ответ

1

Вы должны изменить свой статический метод так он возвращает 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); 
     } 
    } 

Убедитесь, что ваш «Выбранный» также такого типа:

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

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

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

-1

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

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

+0

Невозможно преобразовать список в Reeks – Ivaro18

+0

@ Ivaro18, кажется, что у вас бесконечный цикл, просмотрите код – Saravanan

+0

Это не сработает. потому что вопрос тотально неправильный. два 'IEnumberable ' не одинаковы –

1

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

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

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

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

+0

Но Reeks реализует IEnumerable , не решит ли эта проблема? Else I rewrite Where – Ivaro18

+1

В Java «ArrayList » также является «списком », но вы по-прежнему не можете использовать его в LinkedList , потому что они реализуют один и тот же интерфейс. – Wormbo