chr*_*ris 3 .net c# generics type-inference c#-3.0
如果我有以下代码
private BaseMessage getMessage()
{
return new OtherMessage();
}
private void CheckType<T>(T type)
{
Console.WriteLine(type.GetType().ToString());
Console.WriteLine(typeof(T).ToString());
}
private void DoChecks()
{
BaseMessage mess = getMessage();
CheckType(mess);
}
Run Code Online (Sandbox Code Playgroud)
为什么我会输出不同的类型?有没有得到类型推断使用传递的对象的实际类型?
泛型类型推断意味着编译器会自动解析传递的参数类型,而无需您明确指定要传递的类型.这意味着这是在编译时完成的:在代码中,在编译期间,编译器只知道BaseMessage,因此参数将作为BaseMessage传递.在运行时,参数的实际类型将是OtherMessage,但这与编译器无关.
因此,您获得的输出绝对有效.除了总是使用Object.GetType而不是typeof()之外,我不知道有什么办法可以解决这个问题.
原因是您已将变量声明mess
为类型BaseMessage
.因此,当你要求类型时,它就会返回BaseMessage
.
它GetType
与typeof
行为的方式有所不同.在运行时GetType
返回对象的实际类型,如果涉及继承,则可以与引用该对象的变量的类型不同(如示例中的情况).不像GetType
,typeof
在解决编译时的类型字面指定的确切类型.
public class BaseMessage { }
public class OtherMessage : BaseMessage { }
private BaseMessage getMessage()
{
return new OtherMessage();
}
private void CheckType<T>(T type)
{
Console.WriteLine(type.GetType().ToString()); // prints OtherMessage
Console.WriteLine(typeof(T).ToString()); // prints BaseMessage
}
private void DoChecks()
{
BaseMessage mess = getMessage();
CheckType(mess);
}
Run Code Online (Sandbox Code Playgroud)
你必须为工作选择合适的工具.使用typeof
时,你想在编译时的类型.使用GetType
时,你想获得一个物体的运行时类型.
归档时间: |
|
查看次数: |
2771 次 |
最近记录: |