通用方法,其中T是type1或type2

gdo*_*ica 26 .net c# compiler-construction generics

有没有办法声明泛型类型是type1 还是 type2 的泛型函数?

例:

public void Foo<T>(T number)
{
}
Run Code Online (Sandbox Code Playgroud)

我可以将T约束为int或long

Ada*_*ski 17

对于ReferenceType对象,您可以执行此操作

public void DoIt<T>(T someParameter) where T : IMyType
{

}
Run Code Online (Sandbox Code Playgroud)

...

public interface IMyType
{
}

public class Type1 : IMyType
{
}

public class Type2 : IMyType
{
}
Run Code Online (Sandbox Code Playgroud)

对于你的情况,使用long as参数会将使用限制为long和int无论如何.

public void DoIt(long someParameter)
{

}
Run Code Online (Sandbox Code Playgroud)

限制为可以使用的任何值类型(如:int,double,short,decimal):

public void DoIt<T>(T someParameter) where T : struct
{

}
Run Code Online (Sandbox Code Playgroud)

有关更多信息,您可以在此处查看官方文档


Dar*_*rov 15

虽然您可以使用泛型约束来限制每个泛型参数T的类型,但遗憾的是,没有任何一个允许您在编译时强制执行T是否为type1 or type2.

也没有任何方法可以在编译时强制执行泛型参数只能是任何基本类型(int,long,double,...).


SLa*_*aks 8

没有.

这没有意义; T在该方法中没有任何可用的编译时类型.

相反,你应该制作两个重载方法.

  • 我认为这是一个合理的问题,如果你在两行之间阅读.看来他正在要求一个约束,例如`where T:number`,遗憾的是它不存在.不过,这将是一个有意义的结构...... (6认同)
  • 我认为这确实有意义.我有一个代码,如果你传递一个不同的参数,那么double,decimal,float,int,long等'将会制动.我想在编译时验证这一点.没有意义吗? (3认同)

Oli*_*bes 5

改为使用重载方法:

public void Foo(int number)
{
} 

public void Foo(long number)
{
}
Run Code Online (Sandbox Code Playgroud)

无论如何,您无法对泛型类型执行算术运算.请注意,您可以将int值传递给long参数.它会自动转换为long.因此,只有一个带long参数的方法就足够了.

较旧的编程语言遵循"只能有一个"原则.C#允许您在同一个类,接口或结构中使用多个具有相同名称的方法.这些方法必须具有不同的签名.这意味着它们必须具有不同数量的参数或具有不同类型(或两者)的参数.这称为方法重载.