在几个不同的场合,我试图从一个离声明较远的变量中获取它的声明类型,但是发现 typeof(T)
只能用于类型名称。
我想知道是否有任何破坏性的更改可以允许使用 typeof(variable)
。
例如,使用以下代码:
class Animal { /* ... */ }
class Goat : Animal { /* ... */ }
/* ... */
var g = new Goat();
Animal a = g;
Console.WriteLine(typeof(Goat));
Console.WriteLine(typeof(Animal));
Console.WriteLine(g.GetType());
Console.WriteLine(a.GetType());
您会得到类似以下的内容:
为什么不能这样做:山羊
动物
山羊
山羊
Console.WriteLine(typeof(g));
Console.WriteLine(typeof(a));
山羊
动物
我粗略地浏览了规范,没有发现任何冲突。我认为在使用 typeof
运算符时,它将清除“为什么选择这种类型?”的疑问。
我知道编译器在这里是有能力的。使用扩展方法实现实际上是微不足道的:
public static Type TypeOf<T>(this T variable)
{
return typeof(T);
}
但那感觉很脏,滥用编译器的类型推断。
typeof(T);
之所以有效是因为.NET中的泛型不是C++模板;所有类型都在编译时确定。 - user1228IPlugin a = b as IPlugin
。 - tnyfst