我正在做一个小例子来检查参数的类型是否有效。
class A
{
}
class B
{
}
class C
{
}
class D
{
public void SomeMethod<T>(T t) where T : class
{
if (t is A)
{
A a = t as A;
}
else if (t is B)
{
B b = t as B;
}
}
}
然后,我可以调用:
A a = new A();
SomeMethod<A>(a);
B b = new B();
SomeMethod<B>(b);
现在,我想阻止将
C
类传递给 SomeMethod
。我想要达到的目标:C c = new C();
SomeMethod<C>(c); // error
为此,我尝试过:
public void SomeMethod<T>(T t) where T : A
{
// accept only class A
}
或者
public void SomeMethod<T>(T t) where T : B
{
// accept only class B
}
我的问题是:如何用
SomeMethod
声明T
可以同时是A
或B
?就像:public void SomeMethod<T>(T t) where T : A, B
{
// accept class A and class B
}
最佳答案
正如 Lee 所说,这违背了泛型的目的。为了实现您所描述的内容,只需为每种情况编写重载
class A { }
class B { }
class C { }
class D
{
public void SomeMethod(A a)
{
//Do stuff with a
}
public void SomeMethod(B b)
{
//Do stuff with b
}
}
如果你想有一个运行时错误,你可以做这样的事情:
class A { }
class B { }
class C { }
class D
{
public void SomeMethod<T>(T t) where T : class
{
if (t is A)
{
A a = t as A;
}
else if (t is B)
{
B b = t as B;
}
else //if (t is C)
{
throw new ArgumentException();
}
}
}
虽然这是一个糟糕的解决方案。重载解决方案仍然更清晰,并且会产生编译时错误。
关于c# - 具有动态 T 的通用方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36650534/