Tag: 铸造

为用户定义的对象types转换

就像我们用__ToString做的那样,是否有一种方法来定义一个铸造的方法? $obj = (MyClass) $another_class_obj;

多余的演员是否得到优化?

我正在更新一些旧的代码,并发现了几个实例,其中每次需要调用其某个属性或方法时,同一个对象将被重复投射。 例: if (recDate != null && recDate > ((System.Windows.Forms.DateTimePicker)ctrl).MinDate) { ((System.Windows.Forms.DateTimePicker)ctrl).CustomFormat = "MM/dd/yyyy"; ((System.Windows.Forms.DateTimePicker)ctrl).Value = recDate; } else { (System.Windows.Forms.DateTimePicker)ctrl).CustomFormat = " "; } ((System.Windows.Forms.DateTimePicker)ctrl).Format = DateTimePickerFormat.Custom; 我的意图是解决这个怪物,但考虑到我有限的时间,我不想打扰任何不影响function或性能的东西。 所以我想知道的是,这些冗余演员是由编译器优化了吗? 我试图通过使用ildasm来简化自己的例子,但是不熟悉IL,我只是更加困惑。 UPDATE 到目前为止,共识似乎是这样的:a)不是,演员阵容不是最优化的,但b)虽然可能会有一些小的performance受到打击,但这不太可能是重要的,c)无论如何我应该考虑修复。 如果我有时间的话,我已经决定解决这些问题了。 同时,我也不会担心。 感谢大家!

为unique_ptrdynamic投射

正如Boost中的情况一样,C ++ 11提供了一些用于强制shared_ptr函数: std::static_pointer_cast std::dynamic_pointer_cast std::const_pointer_cast 不过,我想知道为什么没有unique_ptr等价函数。 考虑以下简单的例子: class A { virtual ~A(); … } class B : public A { … } unique_ptr<A> pA(new B(…)); unique_ptr<A> qA = std::move(pA); // This is legal since there is no casting unique_ptr<B> pB = std::move(pA); // This is not legal // I would like to do something […]

为什么不这reinterpret_cast编译?

我明白reinterpret_cast是危险的,我只是做这个来testing它。 我有以下代码: int x = 0; double y = reinterpret_cast<double>(x); 当我尝试编译程序时,它给我一个错误说 invalid cast from type 'float' to type 'double 这是怎么回事? 我以为reinterpret_cast是你可以用来将苹果转换成潜艇的stream氓演员,为什么这个简单的演员不能编译?

在Scala中asInstanceOf 和(o:T)有什么区别?

我看到有两种方法在Scala中投射一个对象: foo.asInstanceOf[Bar] (foo: Bar) 当我尝试,我发现asInstanceOf不使用隐式转换,而另一个。 这两种方法之间有什么不同? 在哪里推荐使用一个呢?

Swift double到string

在我更新xCode 6之前,我没有任何问题将一个双重stringbur现在它给了我错误 var a: Double = 1.5 var b: String = String(a) 它给了我错误消息“双不能转换为string”。 有没有其他办法可以做到这一点?

如何在Java中从List <Double>转换为double ?

我有一个像这样的variables: List<Double> frameList = new ArrayList<Double>(); /* Double elements has added to frameList */ 我怎样才能有一个新的variables有一个types的double[]从Javavariables高性能?

在C中投射指针的规则是什么?

K&R没有超过它,但他们使用它。 我试着通过编写一个示例程序来看它是如何工作的,但是效果并不好: #include <stdio.h> int bleh (int *); int main(){ char c = '5'; char *d = &c; bleh((int *)d); return 0; } int bleh(int *n){ printf("%d bleh\n", *n); return *n; } 它编译,但我的打印语句吐出垃圾variables(每次我调用该程序时,它们是不同的)。 有任何想法吗?

性能打击从C + +风格转换?

我是新来的C + +风格强制转换,我担心使用C ++风格强制转换会破坏我的应用程序的性能,因为我的中断服务程序中有一个实时关键的截止date 。 我听说有些演员甚至会抛出exception! 我想使用C ++风格强制转换,因为它会使我的代码更“健壮”。 但是, 如果有任何性能下降,那么我可能不会使用C ++风格的转换,而是花费更多的时间来testing使用C风格转换的代码。 有没有人做过任何严格的testing/分析来比较C ++风格演员的performance与C风格演员? 你的结果是什么? 你画什么结论?

用户自定义的基类转换运算符

介绍 我知道“不允许用户自定义转换到基类或从基类转换”。 MSDN给出了这个规则的解释,“你不需要这个操作符”。 我明白,用户定义的基类转换是不需要的,因为这显然是隐含的。 但是,我确实需要从基类转换。 在我目前的devise中,一个非托pipe代码的包装,我使用一个指针,存储在一个实体类。 所有使用指针的类派生自该实体类,例如Body类。 因此我有: 方法A. class Entity { IntPtr Pointer; Entity(IntPtr pointer) { this.Pointer = pointer; } } class Body : Entity { Body(IntPtr pointer) : base(pointer) { } explicit operator Body(Entity e) { return new Body(e.Pointer); } } 这个演员是非法的。 (请注意,我没有打扰访问者)。 没有它,编译器将允许我这样做: 方法B (Body)myEntity … 但是,在运行时,我会得到一个exception说这个投射是不可能的。 结论 因此,在这里,我需要一个基类的用户定义转换,而C#拒绝给我。 使用方法A,编译器会发出抱怨,但代码会在运行时在逻辑上工作。 使用方法B,编译器不会抱怨,但代码在运行时显然会失败。 在这种情况下,我觉得奇怪的是,MSDN告诉我,我不需要这个运算符,编译器的行为就好像是隐式的(方法B)。 […]