C# 扩展方法返回InvalidCastException
我正在努力学习如何使用扩展方法,并创建了自己的扩展方法。现在我尝试运行我的代码,但Visual Studio给了我一个错误,我有一个未处理的InvalidCastException,所以我处理了它并尝试运行它 我必须在catch块中返回null,所以我还有另一个未处理的异常,并将其打印出来 现在,当我尝试运行这段代码时,输出是C# 扩展方法返回InvalidCastException,c#,exception,exception-handling,extension-methods,C#,Exception,Exception Handling,Extension Methods,我正在努力学习如何使用扩展方法,并创建了自己的扩展方法。现在我尝试运行我的代码,但Visual Studio给了我一个错误,我有一个未处理的InvalidCastException,所以我处理了它并尝试运行它 我必须在catch块中返回null,所以我还有另一个未处理的异常,并将其打印出来 现在,当我尝试运行这段代码时,输出是 InvalidCastException 空引用异常 通过向强制转换添加(动态)尝试了此处找到的解决方案,结果相同 注意,我有java背景,不是C# 使用系统; 使用Sy
InvalidCastException
空引用异常
通过向强制转换添加(动态)尝试了此处找到的解决方案,结果相同
注意,我有java背景,不是C#
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
命名空间控制台应用程序4
{
班级计划
{
静态void Main(字符串[]参数)
{
气味r=新气味();
IEnumerable selectie=r.TakeRange(101000);
尝试
{
foreach(选择中的int i)
{
WriteLine(“selectie:{0}”,i);
}
}
捕获(NullReferenceException)
{
Console.WriteLine(“NullReferenceException”);
}
Console.ReadLine();
}
}
静态类MyExtension
{
公共静态气味范围(此气味为r,整数开始,整数结束)
{
尝试
{
返回(气味)r.Where(i=>i>start&&i
您应该更改以下行
return(Reeks)r.Where(i=>i>start&&i
到
return(Reeks)(r.Where(i=>i>start&&i
where子句返回应转换为列表的枚举数。此外,您还可以尝试在linq中使用跳过和获取来替换上述代码段。您正在try
块中铸造Where
调用的返回值,以键入Reeks
:
return (Reeks)r.Where(i => i > start && i < end);
return(Reeks)r.Where(i=>i>start&&i
但是,在任何地方都没有名为Where
的方法实际返回类型为Reeks
的对象。该代码调用Enumerable.Where
,它返回某种IEnumerable
实现,但肯定不是您自己的类型
您必须实现一个名为Where
的新方法(扩展或实例),该方法可以在Reeks
对象上调用,还可以返回Reeks
对象。或者,您可以简单地接受这样一个事实,即Where
不返回Reeks
,而只希望返回IEnumerable
。您应该更改静态方法,使其返回IEnumerable
,请查看以下内容:
static class MyReeksExtension {
public static IEnumerable <int> TakeRange(this IEnumerable<int> r, int start, int end) {
return r.Where(i => i > start && i < end);
}
}
静态类MyReeksExtension{
公共静态IEnumerable TakeRange(此IEnumerable r,int start,int end){
返回r.Where(i=>i>start&&i
确保您的“selectie”也属于此类型:
IEnumerable<int> selectie = r.TakeRange(10, 1000);
foreach (int n in selectie)
Console.Write("{0}; ", n);
IEnumerable selectie=r.TakeRange(101000);
foreach(选择中的int n)
Write(“{0};”,n);
没问题,我也得找人帮忙:在哪一行?调试代码了吗?在两个try主体上,从return(Reeks)r.Where(i=>i>start&&i气味的类型。其中
不再是气味Reeks
是IEnumerable
但每个IEnumerable
都不是Reeks
。正如现在定义的那样,Reeks
是一个生成硬编码列表的类。它不是用来保存自定义数据的。你能解释一下这个类的意图吗?对于你的java知道的思想:考虑一个扩展方法,它是在第一个代码>指定的类中声明的一个“魔术自定义实例方法”。对于Where
方法,这是IEnumerable
。查找扩展方法的签名,您将看到它还返回IEnumerable
,而不保证更具体的类型。(除了两个T
显然是相同的以外)无法将列表转换为Reeks@Ivaro18,似乎您有一个无限循环,请检查代码。这根本不起作用。因为这个问题完全错了。两个IEnumerable
不一样,但是Reek实现了IEnumerable,这难道不能解决这个问题吗?否则我将重写其中的Java,ArrayList
也是一个列表
,但您仍然无法将其强制转换到链接列表
,因为它们实现了相同的接口。
IEnumerable<int> selectie = r.TakeRange(10, 1000);
foreach (int n in selectie)
Console.Write("{0}; ", n);