为什么这个对象类型会改变我

Con*_*eak 1 c# asp.net

在开发工具中,它显示如下类型:

IClass {Class23}
Run Code Online (Sandbox Code Playgroud)

在调试器中(运行时),它将其显示为以下类型:

Class23
Run Code Online (Sandbox Code Playgroud)

IClass并且Class23具有不同的属性,似乎我可以在它作为类型运行时访问它,但是当我尝试编码属性时它不会构建,Class23因为intellisense希望我输入属性IClass.有人可以解释这种行为以及我应该从Class23对象何时访问属性IClass {Class23}

我试过这个,但它只返回null:

Class23 myclass = Function(returns IClass {Class23}) as Class23
Run Code Online (Sandbox Code Playgroud)

救命!


一些代码,不确定它是否有帮助:

   Bucket Cats = Dictionary1["key1"] as Bucket;
   IEnumerable<IClass> links = Cats.Links;

   // this should actually be `Class23`
   var Name = links.ElementAt(0).Name; //<--Error
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 5

随着更新:

IEnumerable<IClass> links = Cats.Links;

// this should actually be `Class23`
var Name = links.ElementAt(0).Name; //<--Error
Run Code Online (Sandbox Code Playgroud)

这里的错误是你的期望.如果你有一个序列IClass,那么ElementAt(0) 返回一个IClass.你没有自动施法(除非你作弊,并且:不要).如果您知道该项目是a Class23,那么:

var Name = ((Class23)links.ElementAt(0)).Name; // could also use .First()
Run Code Online (Sandbox Code Playgroud)

您还可以使用:

IEnumerable<Class23> links = Cats.Links.Cast<Class23>();
Run Code Online (Sandbox Code Playgroud)

但是,坦率地说,我不认为你应该寻找的接口里面所有.如果它对于IClass公开它是有用的Name,那么添加Nameinterface.


在开发工具中,它显示如下类型:

听起来像"它"你指的是静态类型的作为IClass,并已提供的实例Class23恰好实现IClass.那很好也很正常 - 没有错(名字除外).但接口的整个的一点是,你不应该通常需要跟该类型的成员:您只需要通过接口公开的API.如果你需要更多:你已经打破了抽象.然而,有时候,是的 - 你需要打破抽象,例如某些方面的特殊情况.在这种情况下...演员:

IClass foo = ...


if(foo is Class23) {
    var bar = (Class23)foo;
    bar.SomeClassMember = 42;
}
Run Code Online (Sandbox Code Playgroud)