asp.net c#,匿名为一个铸造对象赋值(一个班轮挑战!)

时间:2013-03-22 16:38:19

标签: c# variables casting variable-assignment anonymous

Ight,所以我喜欢一个衬垫,而且我已经很好地凝聚了各种各样的东西。出于某种原因,他们让我开心,他们帮助我学习。计算机程序员生活的亮点!

所以无论如何,我需要有一个带有铸造对象分配的帮助:

以下是一个简单属性的示例:

protected InterfaceType Object{
    get{ return (InterfaceType)this.Page;} // no red squigglies, works fine
    set{ (InterfaceType)this.Page = value; } // red squigglies(left hand of argument must be a variable, property or indexer)
}

但是我可以这样做:

protected InterfaceType Object{
    get{ return (InterfaceType)this.Page;} // no red squigglies, works fine
    set{ var o = (InterfaceType)this.Page; o = value; } // works fine
}

如果(InterfaceType)this.Page返回一个明显的对象:

return (InterfaceType)this.Page;

我可以把它分配给东西:

var o = (InterfaceType)this.Page;

并为其分配内容:

o = value;

对我来说,我觉得我正在创造一个新的不必要的东西指针;因为如果我可以用它来检索它,下面只是一个指向这个对象的指针:

(InterfaceType)this.Page

3 个答案:

答案 0 :(得分:1)

你可能需要在this.page之后删除额外的分号并删除类型转换。

更改

set{ (InterfaceType)this.Page; = value; }

set{ this.Page = value; }

答案 1 :(得分:1)

这里有几个问题。如果this.Page被声明为InterfaceType的实例,则根本不需要投射。

这表明您正在尝试将InterfaceType的实例向下转换为设置者中的Page类型。显然,这不安全,无论如何你的演员都无法奏效。我会改为:

set { this.Page = (value as WhateverTypePageIs); }

这意味着如果演员表无效,您的setter将不再抛出异常,只会将this.Page设置为null。如果这不可取,您可以使用:

set { this.Page = ((WhateverTypePageIs)value); }

哪个仍会抛出异常。

但是,所有这一切都指向了一个更深层次的问题。如果您想拥有setter但将值存储为更具体的类型,则应使Objectthis.Page的类型相同,这样您就可以对任何调用者明确限制。

答案 2 :(得分:-1)

您必须将表达式的右侧转换为所需类型:

set{ this.Page = (InterfaceType)value; }

但是,读取代码时,Page完全有可能在继承层次结构中被定义为较小的类型;在这种情况下,不需要演员表:

set { this.Page = value; }