C#泛型:没有办法将类型约束为具有静态方法
本文关键字:约束 类型 静态方法 泛型 | 更新日期: 2023-09-27 17:58:29
有人能用简单的话向我解释一下吗:
无法将类型约束为有一个静态方法。你不能,因为例如,在界面
非常感谢你们这些可爱的人:)
使用泛型,您可以添加一个约束,这意味着提供的泛型类型必须满足一些条件,例如:
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) {
....
}
}
这里有趣的是SomeBaseType
和ISomeInterface
,因为它们允许您要求(和使用)在这些类型上定义的函数-例如,where T : IList
允许您访问Add(...)
等!简单地说:对于这样的东西,没有这样的机制
- 带参数的构造函数
- 静态方法
- 运算符/转换
- 未通过基类型或接口定义的任意方法
所以:你不能要求这些,也不能使用它们(除非通过反思)。然而,对于其中的一些,可以使用dynamic
。
所以,基本上:
public class A{}
public class B{
public static void Foo() {}
}
不能在中为T
编写通用约束
public class C<T> {}
这样,根据静态方法Foo()
的存在与否,您可以限制仅接受A
或B
。
想象一下以下不起作用的代码:
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();
}
这是因为不允许/不能将实现类约束为静态方法。