如何告诉构造函数它应该只使用原始类型

Wii*_*axx 5 c# types overloading .net-4.0

我创建了一个只能处理原始(或ICloneable)类型的类

我想知道是否可以这样说:

 public myobject(primitiv original){...}
Run Code Online (Sandbox Code Playgroud)

或者我真的需要为每个基本类型创建一个构造函数,如:

 public myobject(int original){...}
 public myobject(bool original){...}
 ...
Run Code Online (Sandbox Code Playgroud)

我想要实现的是创建一个具有3个公共属性Value,Original和IsDirty的对象.
价值将是一个深刻的原始克隆,所以原始需要是原始的或ICloneable

Ren*_*nan 6

如果你想这样做迫使谁使用你的API来使用这些类型(如果他们使用错误的类型,通过编译时错误),我担心它无法完成.

但是,您可以object在构造函数中接收一个,评估其类型,并抛出一个ArgumentException参数既不是"原始"类型也不是实现的情况ICloneable.

编辑:这可能很有用.您可以使用以下代码确定变量是否属于基本类型:

Type t = foo.GetType();
t.IsPrimitive; // so you don't have to do an evaluation for each primitive type.
Run Code Online (Sandbox Code Playgroud)


The*_*kis 6

C#中的原始类型被定义为结构(通常ValueType在.NET CLR中实现).我相信你有两个选择:

  1. 如前所述:接收任何类型,针对每个可接受的类型进行检查,如果不匹配则抛出异常.
  2. 使您的类具有通用性,使用约束where T : struct(使用T类型参数)使构造函数通用.这将捕获所有结构,而不仅仅是原始类型,但我认为这是您无需手动检查和编译时检查的最佳选择.当然,您可以将此约束与其他约束混合使用.

您可以将上面的两个选项结合起来,让一些检查在编译时完成,其中一些在运行时完成.