2016-09-30 73 views
-1

我正在使用私有对象来单元测试一个类。我想访问浏览器的值,这是一个枚举,并有一个不同的浏览器列表。我不断收到“操作必须用引用类型或可空类型可以使用”。我是用这样的:使用私有对象访问枚举属性

 Browser browser = Browser.Chrome; 
     PrivateObject pvtObject = new PrivateObject(ClassName); 
     Browser browserProperty = pvtObject.GetFieldOrProperty("Browser") as Browser; 

UPDATE 当我使用:

var browserProperty = pvtObject.GetFieldOrProperty("Browser"); 

它工作正常,但我需要知道为什么..

回答

3

您收到的错误消息告诉你你的问题是什么。 as运算符用于在引用类型或可为空的类型之间执行某些类型的转换。您的浏览器枚举是不可为空的值类型,因此不能与as关键字一起使用。

以下原因是因为您正在使用隐式类型var定义browserProperty变量。在编译时,由于GetFieldOrProperty方法的返回类型,browserProperty变量的强类型为object。下面两行是等价的:

var browserProperty = pvtObject.GetFieldOrProperty("Browser"); 
object browserProperty = pvtObject.GetFieldOrProperty("Browser"); 

使用以下行的作品,因为你明确地铸造的返回类型(的对象)来枚举。

Browser browserTypeProperty = (Browser)pvt_Object.GetFieldOrProperty("Browser"); 

如果你真的使用as关键字,在as操作的右侧必须使用枚举的可空版本:

Browser? browserProperty = pvtObject.GetFieldOrProperty("Browser") as Browser?; 
+0

真的吗?我正在等待你得到一些repv积分downvote :) –

+0

Hahahahaa ...... –

+0

@LB:扩大我的答案,以更好地解释他为什么使用不同的行工作。这是更好的答案吗? –