我已经跨过一个问题超载有似乎独家不同的约束方式运行。 这是我的例子:
public class A
{
public void Do<T>() where T : class
{
}
public void Do<T>() where T : struct
{
}
}
这不,下面的错误“与上述同样的签名成员”编译。 是否有可能同时满足两个条件,或者它的C#编译器只是限制?
我已经跨过一个问题超载有似乎独家不同的约束方式运行。 这是我的例子:
public class A
{
public void Do<T>() where T : class
{
}
public void Do<T>() where T : struct
{
}
}
这不,下面的错误“与上述同样的签名成员”编译。 是否有可能同时满足两个条件,或者它的C#编译器只是限制?
这不是编译器的限制-这是语言的限制(而很可能是CLR为好;我不知道)。
从根本上说是那些发生冲突重载 - 就好像返回类型尝试过载。 它不支持。
这是可能的声明等方法,这些调用所有编译成不同的方法调用:
a.Do<int>();
a.Do<string>();
a.Do<int?>();
...但它总是涉及可选的参数和/或参数数组,这是可怕的 。
另外请注意,尽管你可以不被通用约束超载,您可以通过通用的“元数”(类型参数的数量)过载:
public void Foo() {}
public void Foo<T>() {}
public void Foo<T1, T2>() {}
您无法通过varing泛型参数containts重载方法。 对于一个有效的方法重载,你必须有不同的输入参数的方法。
编译时,这两种方法应具有以下名称:
A.Do``1
作为通用参数的数量进入方法或类的名称。
不知道你的情况,但你可能需要使用反射来调用这些方法:
public class A
{
public void Do<T>()
{
if(typeof(T).IsValueType){
// nasty reflection to call DoValueType
}
else {
// nasty reflection to call DoReferenceType
}
}
private void DoReferenceType<T>() where T : class {
}
private void DoValueType<T>() where T : struct {
}
}