1

嗯,所以我喜欢一个衬里,而且我在浓缩各种东西方面做得很好。出于某种原因,他们让我快乐,他们帮助我学习。计算机程序员生活的亮点!

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

这是一个简单属性的示例:

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
}

If (InterfaceType)this.Page 返回一个对象,如下所示:

return (InterfaceType)this.Page;

我可以把它分配给东西:

var o = (InterfaceType)this.Page;

并为它分配东西:

o = value;

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

(InterfaceType)this.Page
4

3 回答 3

1

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

改变

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

set{ this.Page = value; }
于 2013-03-22T16:40:17.600 回答
1

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

这表明您正在尝试将实例向下转换为setter 中的InterfaceType任何类型。Page显然,这是不安全的,而且你的演员也不会工作。我会将其更改为:

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

这意味着如果强制转换无效,您的 setter 将不再抛出异常,它只会设置this.Pagenull. 如果这不是可取的,您可以使用:

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

仍然会抛出异常。

然而,所有这些都指向一个更深层次的问题。如果您想拥有 setter 但将值存储为更具体的类型,则应将Object其设置为相同的类型,this.Page以便向任何调用者明确该限制。

于 2013-03-22T16:47:02.160 回答
-1

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

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

但是,阅读您的代码,完全有可能将Page其定义为继承层次结构中的较小类型;在这种情况下,不需要强制转换:

set { this.Page = value; }
于 2013-03-22T16:40:38.210 回答