gpt4 book ai didi

c# - 动态 T 的通用方法

转载 作者:行者123 更新时间:2023-11-30 14:26:01 26 4
gpt4 key购买 nike

我正在做一个小例子来检查参数的类型是否有效。

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
}

我的问题是:如何声明SomeMethodT可以同时是AB ?就像:

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com