Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 结构类型上的.Net泛型约束_C#_.net_Generics_Constraints - Fatal编程技术网

C# 结构类型上的.Net泛型约束

C# 结构类型上的.Net泛型约束,c#,.net,generics,constraints,C#,.net,Generics,Constraints,我试图创建一个泛型类,它的实现取决于类型是Int32、Int64、double、float或decimal class Calculator<T> where T: int, double, float, decimal 类计算器,其中T:int、double、float、decimal 这是不对的,但我的语法有问题,你不能这样做。只能对接口、class、struct、空构造函数(new())或基类执行此操作 见: 最接近的是struct,IConvertable 我见过的一种技

我试图创建一个泛型类,它的实现取决于类型是
Int32
Int64
double
float
decimal

class Calculator<T> where T: int, double, float, decimal
类计算器,其中T:int、double、float、decimal

这是不对的,但我的语法有问题,你不能这样做。只能对接口、
class
struct
、空构造函数(
new()
)或基类执行此操作

见:

最接近的是
struct,IConvertable

我见过的一种技术是使用静态构造函数并抛出断言或异常,但这不是编译时检查,而是运行时检查

class Calculator<T>  
   where T : struct
{
   static Calculator()
   {
     Debug.Assert(typeof(T) == typeof(int), "FAIL"); //TODO: extend to other types
   }
}
类计算器
其中T:struct
{
静态计算器()
{
Assert(typeof(T)=typeof(int),“FAIL”);//TODO:扩展到其他类型
}
}

你不能那样做。只能对接口、
class
struct
、空构造函数(
new()
)或基类执行此操作

见:

最接近的是
struct,IConvertable

我见过的一种技术是使用静态构造函数并抛出断言或异常,但这不是编译时检查,而是运行时检查

class Calculator<T>  
   where T : struct
{
   static Calculator()
   {
     Debug.Assert(typeof(T) == typeof(int), "FAIL"); //TODO: extend to other types
   }
}
类计算器
其中T:struct
{
静态计算器()
{
Assert(typeof(T)=typeof(int),“FAIL”);//TODO:扩展到其他类型
}
}

不能在类型参数上指定约束,使其必须是指定的类型集之一,否。请参阅

对于这些特定类型,您可以指定:

where T : struct, IComparable, IFormattable, IConvertible,
          IComparable<T>, IEquatable<T>
其中T:struct,i可比较,i可附加,i可转换,
可比

这可能会很好地限制该集,尽管它也允许其他基本类型,如
byte
ulong
您不能对类型参数指定约束,使其必须是指定的类型集之一,否。请参阅

对于这些特定类型,您可以指定:

where T : struct, IComparable, IFormattable, IConvertible,
          IComparable<T>, IEquatable<T>
其中T:struct,i可比较,i可附加,i可转换,
可比
这可能会很好地限制集合,尽管它还允许其他基本类型,如
byte
ulong

我试图创建一个泛型类,其实现取决于类型是Int32、Int64、double、float或decimal

那么它就不是泛型的。泛型类型对所有可能的类型参数都是相同的,如泛型队列或泛型字典

“计算器”类是为这样的特性提供的最常见的场景;我们一直收到这个功能请求。我们假设它是一个假设的C#未来版本,尚未公布,也不存在。正确使用该功能需要CLR的假设未来版本的大量支持,该版本也尚未发布,也不存在。随着这些事情的发展,这个场景并不是一个特别重要的优先事项,所以如果它没有实现,请不要失望

有很多方法可以让这种特性浮出水面。例如,我们可以说您可以在接口中放置静态方法。数学运算符是静态方法,所以您可以将类型参数约束为实现静态接口IAddable的类型,或者类似的类型

请记住,埃里克对不存在且可能永远不存在的未宣布产品的未来所做的任何思考都只是为了娱乐。

我试图创建一个泛型类,其实现取决于类型是Int32、Int64、double、float或decimal

那么它就不是泛型的。泛型类型对所有可能的类型参数都是相同的,如泛型队列或泛型字典

“计算器”类是为这样的特性提供的最常见的场景;我们一直收到这个功能请求。我们假设它是一个假设的C#未来版本,尚未公布,也不存在。正确使用该功能需要CLR的假设未来版本的大量支持,该版本也尚未发布,也不存在。随着这些事情的发展,这个场景并不是一个特别重要的优先事项,所以如果它没有实现,请不要失望

有很多方法可以让这种特性浮出水面。例如,我们可以说您可以在接口中放置静态方法。数学运算符是静态方法,所以您可以将类型参数约束为实现静态接口IAddable的类型,或者类似的类型


请记住,Eric对不存在且可能永远不存在的未宣布产品的未来所做的任何思考都只是为了娱乐。

不,你也可以为特定的课程做这些思考。例如“where T:Stream”。哦,或者一个类型参数。难道你不能通过使用
Caclulator
工厂进行编译时检查吗?方法重载只针对支持的类型,而不提供
Calculator
公共构造函数?不,你也可以针对特定的类进行检查。例如“where T:Stream”。哦,或者一个类型参数。难道你不能通过使用
Caclulator
factory来进行编译时检查吗,仅对支持的类型使用方法重载,而不提供
计算器
公共构造函数?无论您尝试做什么,在C#中都是不合法的。似乎您应该使用方法重载而不是泛型无论您尝试做什么,在C#中都是不合法的。似乎您应该使用方法重载而不是泛型+1投票用于f#内联功能。运行时反射使用所述触发完整c#编译器创建任何内容(有人将其打包为服务)