C#泛型:没有办法约束一个类型有一个静态方法?

Idr*_*ees 5 c# generics

有人可以用简单的话向我解释这个问题:

没有办法将类型约束为具有静态方法.例如,您不能在接口上指定静态方法.

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

Mar*_*ell 8

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

  • 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) {
        ....
    }
}
Run Code Online (Sandbox Code Playgroud)

它是SomeBaseTypeISomeInterface是有趣在这里,因为他们让你的需求(和使用)这些类型定义的功能-例如,where T : IList您可以访问Add(...)等.但是!简单地说:没有这样的机制,例如:

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

所以:你不能要求那些,你不能使用它们(除了通过反射).但是,其中一些dynamic可以使用.


And*_*tan 6

所以,基本上:

public class A{}

public class B{
  public static void Foo() {}
}
Run Code Online (Sandbox Code Playgroud)

您不能为Tin 编写通用约束:

public class C<T> {}
Run Code Online (Sandbox Code Playgroud)

这样您就可以限制仅接受AB基于静态方法的存在或不存在Foo().