1 回答
TA贡献1810条经验 获得超5个赞
长话短说
您不能将某些内容强制转换为运行时指定的未知类型。这意味着在您的代码中,您不知道对象的属性或方法是什么,除非您使用更多的反射。在那种情况下,铸造它的意义何在?
有时我们处理直到运行时才知道的类型。但是除非类型真的无关紧要,否则对象是无用的,除非我们可以将它转换为代码中指定的某种预定类型,而不是在运行时。
在这行代码中:
var val = property.GetValue(obj);
的声明类型val由编译器推断。该类型是object因为这是GetValue返回的类型。对象的实际类型可以是string, int, List<Foo>, 等等。但是你有一个valtype的变量object。
如果你能这样做:
var val = property.GetValue(obj) as runtimeType;
那么编译时类型val是什么?它怎么可能有任何值,因为它runTimeType是一个运行时值?除非您可以调用方法或检查其属性,否则该对象是无用的。但是你不能在不知道类型的情况下这样做,除非你使用更多的反射。但是,如果您打算这样做,那么施放它就没有意义了。
在您发布的代码下游的某处,您可能想要实际对涉及其方法或属性的对象执行某些操作。这意味着知道您认为它是什么类型并将其转换为该类型。那将是您的代码中指定的类型,而不是在运行时确定的类型。
例如:
var val = property.GetValue(obj); // I know this is a string
var myString = (string)val;
var findX = myString.IndexOf("X");
我认为它是一个string所以我把它作为一个string。(那里可能有额外的检查。)现在我已经转换了它,我有一个声明为 type 的变量,string我可以将它用作字符串。(除非它不是string- 然后它会抛出运行时异常。)
这就是强制转换的好处 - 它允许我们将某些内容分配给具有我们指定类型的强类型变量,然后相应地使用它。转换为未知类型对我们没有好处。
冒着增加混乱的风险:有人可能会说泛型表示运行时未指定的类型,但事实并非如此。List<T>没有指定是什么T,但是如果您List<T>以某种方式在某处创建一个 ,您将在代码中指定类型。在绝大多数正常场景中,我们必须知道一些关于对象类型的信息,否则该对象对我们来说是无用的。
- 1 回答
- 0 关注
- 123 浏览
添加回答
举报