gpt4 book ai didi

c# - 应用于通用枚举集合的 Cast.Cast 导致无效的转换异常

转载 作者:太空狗 更新时间:2023-10-29 20:27:41 27 4
gpt4 key购买 nike

enum Gender { Male, Female }

var k = new[] { Gender.Male }.Cast<int>().ToList().Cast<int?>().ToList(); //alright

var p = new[] { Gender.Male }.Cast<int>().Cast<int?>().ToList(); //InvalidCastException

第二种情况的原因是什么?我知道我不能投盒装 enumint?直接,但我做了两阶段类型转换,即Cast<int>.Cast<int?>这应该有效。

编辑:

考虑到以下工作,这是令人惊讶的:

object o = Gender.Male;
int i = (int)o; // so here the cast is not to an entirely different type, which works

最佳答案

好的我来查原因了,还是很奇怪。我应该检查一下 Cast<T>我自己首先实现!

这就是Cast<T>已实现:

public static IEnumerable<TResult> Cast<TResult>(this IEnumerable source)
{
IEnumerable<TResult> enumerable = source as IEnumerable<TResult>;
if (enumerable != null)
{
return enumerable; // this is the culprit..
}
if (source == null)
{
throw Error.ArgumentNull("source");
}
return Enumerable.CastIterator<TResult>(source);
}

private static IEnumerable<TResult> CastIterator<TResult>(IEnumerable source)
{
foreach (object current in source)
{
yield return (TResult)((object)current);
}
yield break;
}

现在问题出在first Cast<int>调用:

new[] { Gender.Male }.Cast<int>()

在这里source as IEnumerable<TResult>其中 sourcenew[] { Gender.Male }TResultint 在泛型方法中 返回一个非空值(这基本上意味着( new[] { Gender.Male } 在泛型上下文中是一个 IEnumerable<int>),因此它返回相同的可枚举返回 Gender[] ,并且在下一个 Cast<int?> 调用,执行实际转换,从 Genderint? 失败。至于为什么在通用上下文中发生这种情况,catch it in this question

关于c# - 应用于通用枚举集合的 Cast<int>.Cast<int?> 导致无效的转换异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20292623/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com