digitalmars.D.learn - Implicit conversion from class in parent class fails?
- Namespace (56/56) Jun 16 2012 Why work this:
- Andrew Wiley (26/72) Jun 16 2012 The problem is that this would also work:
- =?UTF-8?B?QWxpIMOHZWhyZWxp?= (30/122) Jun 16 2012 The following is a shorter example, which happens to also produce a more...
Why work this: [code] class Foo { } class Bar : Foo { } class Quatz : Bar { } void foo(Foo f) { } void main() { Foo f = new Foo(); Foo f2; foo(f); foo(f2); Bar b = new Bar(); Bar b2; foo(b); foo(b2); Quatz q = new Quatz(); Quatz q2; foo(q); foo(q2); } [/code] but not: [code] import std.stdio; class Foo { } class Bar : Foo { } class Quatz : Bar { } void bar(Foo[] fs) { } void main() { Foo[] fs = [new Foo()]; Foo[] fs2; bar(fs); bar(fs2); Bar[] bs = [new Bar()]; Bar[] bs2; bar(bs); bar(bs2); Quatz[] qs = [new Quatz()]; Quatz[] qs2; bar(qs); bar(qs2); } [/code] I think that should work also.
Jun 16 2012
On Sat, Jun 16, 2012 at 11:52 AM, Namespace <rswhite4 googlemail.com> wrote= :Why work this: [code] class Foo { } class Bar : Foo { } class Quatz : Bar { } void foo(Foo f) { } void main() { =A0 =A0 =A0 =A0Foo f =3D new Foo(); =A0 =A0 =A0 =A0Foo f2; =A0 =A0 =A0 =A0foo(f); =A0 =A0 =A0 =A0foo(f2); =A0 =A0 =A0 =A0Bar b =3D new Bar(); =A0 =A0 =A0 =A0Bar b2; =A0 =A0 =A0 =A0foo(b); =A0 =A0 =A0 =A0foo(b2); =A0 =A0 =A0 =A0Quatz q =3D new Quatz(); =A0 =A0 =A0 =A0Quatz q2; =A0 =A0 =A0 =A0foo(q); =A0 =A0 =A0 =A0foo(q2); } [/code] but not: [code] import std.stdio; class Foo { } class Bar : Foo { } class Quatz : Bar { } void bar(Foo[] fs) { } void main() { =A0 =A0 =A0 =A0Foo[] fs =3D [new Foo()]; =A0 =A0 =A0 =A0Foo[] fs2; =A0 =A0 =A0 =A0bar(fs); =A0 =A0 =A0 =A0bar(fs2); =A0 =A0 =A0 =A0Bar[] bs =3D [new Bar()]; =A0 =A0 =A0 =A0Bar[] bs2; =A0 =A0 =A0 =A0bar(bs); =A0 =A0 =A0 =A0bar(bs2); =A0 =A0 =A0 =A0Quatz[] qs =3D [new Quatz()]; =A0 =A0 =A0 =A0Quatz[] qs2; =A0 =A0 =A0 =A0bar(qs); =A0 =A0 =A0 =A0bar(qs2); } [/code] I think that should work also.The problem is that this would also work: [code] import std.stdio; class Foo { } class Bar : Foo { } class Quatz : Bar { } void bar(Foo[] fs) { fs[0] =3D new Foo(); // <-- OH NOES } void main() { Foo[] fs =3D [new Foo()]; Foo[] fs2; bar(fs); bar(fs2); Bar[] bs =3D [new Bar()]; Bar[] bs2; bar(bs); bar(bs2); Quatz[] qs =3D [new Quatz()]; Quatz[] qs2; bar(qs); bar(qs2); } [/code]
Jun 16 2012
On 06/16/2012 11:55 AM, Andrew Wiley wrote:On Sat, Jun 16, 2012 at 11:52 AM, Namespace<rswhite4 googlemail.com> wrote:The following is a shorter example, which happens to also produce a more educating error message: import std.stdio; class Foo { } class Bar : Foo { } class Quatz : Bar { } void zar(ref Foo fs) {// <-- ref fs = new Quatz(); // <-- OH NOES } void main() { auto b = new Bar(); zar(b); // <-- Error: cast(Foo)b is not an lvalue } After all of the above, a const reference works as Namespace expects: import std.stdio; class Foo { } class Bar : Foo { } class Quatz : Bar { } void zar(const Foo[] fs) { // <-- const makes it work // ... } void main() { zar([ new Bar() ]); } Ali -- D Programming Language Tutorial: http://ddili.org/ders/d.en/index.htmlWhy work this: [code] class Foo { } class Bar : Foo { } class Quatz : Bar { } void foo(Foo f) { } void main() { Foo f = new Foo(); Foo f2; foo(f); foo(f2); Bar b = new Bar(); Bar b2; foo(b); foo(b2); Quatz q = new Quatz(); Quatz q2; foo(q); foo(q2); } [/code] but not: [code] import std.stdio; class Foo { } class Bar : Foo { } class Quatz : Bar { } void bar(Foo[] fs) { } void main() { Foo[] fs = [new Foo()]; Foo[] fs2; bar(fs); bar(fs2); Bar[] bs = [new Bar()]; Bar[] bs2; bar(bs); bar(bs2); Quatz[] qs = [new Quatz()]; Quatz[] qs2; bar(qs); bar(qs2); } [/code] I think that should work also.The problem is that this would also work: [code] import std.stdio; class Foo { } class Bar : Foo { } class Quatz : Bar { } void bar(Foo[] fs) { fs[0] = new Foo(); //<-- OH NOES } void main() { Foo[] fs = [new Foo()]; Foo[] fs2; bar(fs); bar(fs2); Bar[] bs = [new Bar()]; Bar[] bs2; bar(bs); bar(bs2); Quatz[] qs = [new Quatz()]; Quatz[] qs2; bar(qs); bar(qs2); } [/code]
Jun 16 2012