``编译一些使用带有类型约束的泛型的C#代码时,我遇到了一个有趣的好奇心.我写了一个快速测试用例来说明.我在Visual Studio 2010中使用.NET 4.0.
namespace TestCast
{
public class Fruit { }
public class Apple : Fruit { }
public static class Test
{
public static void TestFruit<FruitType>(FruitType fruit)
where FruitType : Fruit
{
if (fruit is Apple)
{
Apple apple = (Apple)fruit;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
对Apple的强制转换失败并显示错误:"无法将类型'FruitType'转换为'TestCast.Apple'".但是,如果我更改行以使用as运算符,它编译时没有错误:
Apple apple = fruit as Apple;
Run Code Online (Sandbox Code Playgroud)
有人可以解释为什么会这样吗?
我正在开发一个应用程序,用于解决涉及圆和直线(可构造数字)的二维欧几里德几何中的二次约束,并以图形方式表示结果.我发现这篇文章是在二叉树中表示这些问题,但我遇到了一个实现问题:
我需要比较a + b*sqrt(c)小于,大于和相等的标准关系操作的表单编号.的价值c为我的应用仅限于2,3,5,6,10,15,或30.例如(类似于C的伪代码,^是"对于运算符的幂"):
boolean CompareConstructibleNumbers(int a1, b1, c1, a2, b2, c2)
{
return a1plusb1sqrtc1_is_greater_than_a2plusb2sqrtc2 =
4 * ((a1 - a2)^2) * (b1^2) * c1
> ((b2^2) * c2 - (b1^2) * c1 - (a1 - a2)^2)^2;
// Not sure if I have the direction right for >
}
Run Code Online (Sandbox Code Playgroud)
这个天真的实现需要我多次,所以32位整数变成64位整数,然后是128位等.我不想在我的实现中使用自定义BigInteger来存储仅用于的临时值比较.
我也不想使用浮点数,并希望避免在尝试直接计算sqrt(c)为浮点数时出现舍入错误的风险.我需要精确计算这个应用程序,不一定是无限精度,但我想避免舍入误差并确保正确的结果.
如何在a + …
我正在使用C#,并希望尽可能避免使用unsafe代码.如果我有一个大小足以填充缓存行的对象或数组,并且我想写入数组的对象或索引的每个字段,CPU是否会在刷新写入行之前等待所有写入操作或当只有一个或几个写入发生时,它会提前刷新吗?
如果我想只在所有写入行发生之后才发生刷新,那么我应该快速连续地在例程结束时执行所有写操作吗?我知道CPU和缓存一致性协议可能会有所不同,我正在寻找一个普遍真实的经验法则.
我在C#工作.我有一个无符号的32位整数i,它响应外部用户控制的事件逐渐递增.该数字以十六进制显示,作为用户能够输入和查看以后查找的唯一ID.我需要i显示一个非常不同的8个字符串,如果它增加或两个整数在值上相反(例如,距离<256).例如,if i = 5,j = 6然后:
string a = Encoded(i); // = "AF293E5B"
string b = Encoded(j); // = "CD2429A4"
Run Code Online (Sandbox Code Playgroud)
对此的限制是:
然而:
我认识到最小完美哈希函数满足了这些要求,但是我找不到能够完成我需要的东西或学习如何派生出一个.
我已经看到了这个问题,虽然它是类似的,但我相信我的问题在其要求中更加具体和精确.给出这个问题的答案(截至本文撰写时)引用了3个可能的实现链接,但不熟悉Ruby我不知道如何获得"obfuscate_id"(第一个链接)的代码,Skipjack感觉像是矫枉过正我需要的东西(第二个链接),Base64不使用我感兴趣的字符集(十六进制).
我从诸如“为什么你永远不应该将浮点数转换为整数”之类的文章以及许多其他喜欢它的文章中了解到,将浮点数转换为有符号整数是很昂贵的。我也知道某些架构上的某些转换指令或 SIMD 向量指令可以加快该过程。我很好奇将整数转换为浮点数是否也很昂贵,因为我在该主题上找到的所有材料都只讨论了从浮点数转换为整数的成本。
在有人说“你为什么不测试它之前?” 我不是在谈论特定架构上的性能,我对遵循IEEE 754-2008标准的跨多个平台的转换算法行为感兴趣。转换算法是否有一些固有的东西会影响一般的性能?
直觉上,我认为从整数到浮点的转换通常会更容易,原因如下:
仅当整数的精度超过二进制浮点数的精度时才需要舍入,例如 32 位整数到 32 位浮点数可能需要舍入,但 32 位整数到 64 位浮点数则不需要,两者都不将是一个仅使用 24 位精度的 32 位整数。
无需检查 NAN 或 +/- INF 或 +/- 0。
没有溢出或下溢的危险。
从 int 到 float 的转换可能导致跨平台性能不佳的原因是什么(如果有的话(除了在软件中模拟浮点数的平台)?从 int 到 float 的转换通常比 float 到 int 便宜吗?
在 C# 4.0 中,我尝试Tuple<Guid, int[]>使用 DataContractSerializer 序列化和反序列化 a。我已经成功序列化和反序列化 type Guid、 typeint[]和 type Tuple<Guid, int>。如果我尝试序列化 type Tuple<Guid, int[]>,所有内容都会编译,但会出现以下运行时异常:
Type 'System.Int32[]' with data contract name
'ArrayOfint:http://schemas.microsoft.com/2003/10/Serialization/Arrays'
is not expected. Consider using a DataContractResolver or add any types
not known statically to the list of known types - for example, by using
the KnownTypeAttribute attribute or by adding them to the list of known
types passed to DataContractSerializer.
Run Code Online (Sandbox Code Playgroud)
我的序列化和反序列化例程很简单:
public static string Serialize<T>(this T obj)
{ …Run Code Online (Sandbox Code Playgroud)