C#泛型:没有办法将类型约束为具有静态方法

本文关键字:约束 类型 静态方法 泛型 | 更新日期: 2023-09-27 17:58:29

有人能用简单的话向我解释一下吗:

无法将类型约束为有一个静态方法。你不能,因为例如,在界面

非常感谢你们这些可爱的人:)

C#泛型:没有办法将类型约束为具有静态方法

使用泛型,您可以添加一个约束,这意味着提供的泛型类型必须满足一些条件,例如:

  • where T : new()-T必须具有公共的无参数构造函数(或者是struct
  • where T : class-T必须是引用类型(class/interface/delegate
  • where T : struct-T必须是值类型(而不是Nullable<TSomethingElse>
  • where T : SomeBaseType-T必须继承自SomeBaseType(或SomeBaseType本身)
  • where T : ISomeInterface-T必须实现ISomeInterface

例如:

public void SomeGenericMethod<T>(T data) where T : IEnumerable {
    foreach(var obj in data) {
        ....
    }
}

这里有趣的是SomeBaseTypeISomeInterface,因为它们允许您要求(和使用)在这些类型上定义的函数-例如,where T : IList允许您访问Add(...)等!简单地说:对于这样的东西,没有这样的机制

  • 带参数的构造函数
  • 静态方法
  • 运算符/转换
  • 未通过基类型或接口定义的任意方法

所以:你不能要求这些,也不能使用它们(除非通过反思)。然而,对于其中的一些,可以使用dynamic

所以,基本上:

public class A{}
public class B{
  public static void Foo() {}
}

不能在中为T编写通用约束

public class C<T> {}

这样,根据静态方法Foo()的存在与否,您可以限制仅接受AB

想象一下以下不起作用的代码:

interface IWithStatic
{
    void DoIt(); // non-static
    static void DoItStatic(); // static
}
class C1 : IWithStatic
{
    void DoIt() {} // non-static
    static void DoItStatic(){} // static
}
class C2 : IWithStatic
{
    void DoIt() {} // non-static
    static void DoItStatic(){} // static
}

而且,在一个程序中:

IWithStatic myObj = GetWithAnyMethod(); // Return a C1 or C2 instance
myObj.DoIt(); // working, as the runtime type is used (either C1 or C2);

但是有了静态。。。编译器如何解释这个:

IWithStatic.DoItStatic(); // Not knowing which type to use

你知道现在出了什么问题吗?

不可能有:

public interface IInterface {
   static void Method();
}

这是因为不允许/不能将实现类约束为静态方法。