相关疑难解决方法(0)

使用ToList时为什么Linq Cast会失败?

考虑这个人为的,琐碎的例子:

    var foo = new byte[] {246, 127};
    var bar = foo.Cast<sbyte>();
    var baz = new List<sbyte>();
    foreach (var sb in bar)
    {
        baz.Add(sb);
    }
    foreach (var sb in baz)
    {
        Console.WriteLine(sb);
    }
Run Code Online (Sandbox Code Playgroud)

借助Two's Complement的魔力,将-10和127打印到控制台.到现在为止还挺好.有敏锐眼光的人会看到我正在迭代一个可枚举并将其添加到列表中.听起来像是ToList:

    var foo = new byte[] {246, 127};
    var bar = foo.Cast<sbyte>();
    var baz = bar.ToList();
    //Nothing to see here
    foreach (var sb in baz)
    {
        Console.WriteLine(sb);
    }
Run Code Online (Sandbox Code Playgroud)

除此之外不起作用.我得到这个例外:

异常类型:System.ArrayTypeMismatchException

消息:无法将源数组类型分配给目标数组类型.

我觉得这个例外非常奇怪,因为

  1. ArrayTypeMismatchException - 我自己也没有对阵列做任何事情.这似乎是一个内部例外.
  2. Cast<sbyte>罚款(如在第一个例子)的作品,它使用时的ToArrayToList问题提出了自己.

我的目标是.NET v4 …

c# linq casting

35
推荐指数
1
解决办法
1763
查看次数

当x和y都为真时,"x&y"怎么会变错?

语境:

我正在学习C#并且一直在搞乱Pex for fun网站.该站点向您提出重新实施秘密算法的挑战,方法是在站点中键入代码并检查输入和输出在您的实现和秘密实现之间的差异.

问题:

无论如何,我被困在一个名为XAndY的基本代码决斗上.

从名称来看,答案显而易见:

public static bool Puzzle(bool x, bool y) 
{
    return x && y;
}
Run Code Online (Sandbox Code Playgroud)

但是,这是不正确的,Pex告诉我,以下输入产生的结果与秘密实现不同:

输入:

x:true y:true(0x02)

输出:

我的实现:true(0x02)

秘密实施:假

不匹配你的拼图方法产生了错误的结果.

代码:Puzzle(true,PexSafeHelpers.ByteToBoolean((byte)2));

在尝试比较不同类型的true之后出现了很多困惑之后,我意识到Pex正在寻找的实现实际上只是使用了按位AND:

return x & y;
Run Code Online (Sandbox Code Playgroud)

问题:

我认为,出于语义和短路的原因,您应该使用逻辑&&来比较布尔值,但无论如何:

  1. 这是否意味着x & y并且对于所有可能的bool参数x && y最终没有相同的输出?(或者它可能是Pex中的一些东西吗?)
  2. 这是否意味着您可以区分trueC#中不同的bool值?如果是这样,怎么样?

c# boolean pex bitwise-operators logical-operators

20
推荐指数
1
解决办法
2867
查看次数

标签 统计

c# ×2

bitwise-operators ×1

boolean ×1

casting ×1

linq ×1

logical-operators ×1

pex ×1