【问题标题】:Calling static method on a generic class [duplicate]在泛型类上调用静态方法[重复]
【发布时间】: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&lt;T&gt; 是独立于其最终类型参数 T 编译的。

标签: c# generics


【解决方案1】:

当您执行Program1 : Program 时,您是在告诉所有 Program1 实例不仅属于 Program1 类型,而且属于 Program1 类型,因为它继承了它。

但是当您执行Program1&lt;T&gt; 时,您是在告诉 Program1 除了它自己的类型之外还可以有任何独立的类型参数,以使用该独立类型执行操作。

如果您使用Program1 : Program,您的静态方法可以执行以下操作:

class Program1 : Program
{
    public static void check()
    {
        Program.Main() // but the real good thing to do is just avoid this check method.
        // and use just Program1.Main() in other places
    }
}

在使用Program1&lt;T&gt; 的情况下,我看不到任何解释该用法的内容,除非您尝试做一些我们在问题中没有读到的进一步事情。在这里,T 并不是真正的程序,即使您像以前那样设置了约束。 T 只是一个泛型类型。使用它的原因是允许你的类使用不同的类型。如果您只使用一种类型,则没有理由使用泛型类型,只需使用Program

【讨论】:

    【解决方案2】:

    当您的通用类型的条件是“程序”类型本身时,我认为您可能不希望“程序 1”扩展“程序”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-16
      • 2015-03-09
      • 1970-01-01
      • 2021-05-17
      • 1970-01-01
      • 2011-07-14
      • 2011-01-07
      相关资源
      最近更新 更多