【发布时间】:2013-05-02 10:33:34
【问题描述】:
我有一个带有静态方法的通用类程序,如下所示:
class Program
{
public static void Main()
{
Console.WriteLine("HI from program");
Console.ReadLine();
}
}
当我尝试访问通用类 Program1 中的静态 Main 方法时,如下所示:
class Program1<T> : Program where T : Program
{
public static void check()
{
T.Main();
}
}
我得到错误:
'T'是一个'类型参数',在给定的上下文中是无效的
但是如果我使用
public static void check()
{
Program.Main();
}
一切运行良好。 你能解释一下我可能犯的错误吗?
【问题讨论】:
-
在这种情况下,您可以调用 Main() 而不需要前缀
-
我知道很容易将
static视为“属于类而不是实例”的意思,在这种情况下,这样的事情应该可以工作;但是考虑 C# 的static的更好方法是“在编译时可解析”,这很明显为什么不能这样做。 -
@AakashM:我不明白为什么该调用在编译时无法从技术上解决,因此目前尚不清楚为什么该定义更好。
-
@jon 因为 C# 没有“虚拟静态”,所以
T可能是没有Main的东西;编译器是否应该检查Program的每个继承者以绑定调用? -
@AakashM: 不,但它可以使用
T的确切类型的知识来对Program1的特定实例直接绑定到该类,a-la C++ 模板。我知道泛型不是那样工作的(例如,不可能在我可以在我的应用程序中引用的程序集中提供一个泛型类型)所以这在实践中是不可行的,但至少这不是明显为什么这是不可解决的。使它无法解析的原因是Program1<T>是独立于其最终类型参数T编译的。