有没有办法在构造函数中强制显式参数类型?

时间:2014-05-28 20:09:30

标签: c# constructor explicit

C#中的构造函数的explicit关键字是否有类似内容?它似乎只影响C#中的强制转换操作符。

举个例子:

public Foo( long value )
{
    m_value = value;
}

我正在寻找的是使以下代码无法编译的方法:

int bar = 10;
Foo fail = new Foo( bar );

这在C#中是否可行?

5 个答案:

答案 0 :(得分:14)

您可以通过添加带有int的构造函数的重载来导致编译器错误,并将其标记为已过时:

public class Foo {

  private long m_value;

  public Foo(long value) {
    m_value = value;
  }

  [Obsolete("The constructor has to be called with a long value, not an int value.", true)]
  public Foo(int value) {}

}

通过将true指定为Obsolete的第二个参数,它将导致编译器错误,而不是通常的警告。

答案 1 :(得分:3)

C#不提供与C ++ explicit关键字等效的功能。 但是,您可以创建自己的Long类,只启用所需的转换(因此,请不要将隐式转换运算符定义为int)。

public class MyLong
{
    public long Value { get; set; }

    // Declare here any wanted conversion operator
}

然后:

public Foo( MyLong mylong )
{
    m_value = mylong.Value;
}

如果使用整数调用,则无法编译。

答案 2 :(得分:3)

据我所知,我担心C#中的构造函数参数中使用explicit的C#中没有任何等价物,没有任何会以你想要的方式导致编译错误。如您所知,explicit关键字仅适用于强制转换运算符。

int可以隐式地投放到long而不会损失精度,所以它会是。在这种情况下限制类型我看不出任何优势。

答案 3 :(得分:1)

实现此目的的一种(非常模糊)方法是重载int并应用Obsolete属性,并为true传递IsError } property。

public Foo(long value)
{
    m_value = value;
}

[Obsolete("Do not call this with ints", true)]
public Foo(int value)
{
    throw new NotImplementedException();
}

用法

var x = new Foo(5); // gets error

var x = new Foo(5L); // no warning / error

然而,正如评论中所解释的那样,这可能是解决问题的一个糟糕的解决方案,可以通过更好的方式解决。

我只回答了这个问题,因为要求回答这个问题很迂腐。

答案 4 :(得分:-7)

让构造函数签名为object而不是long,然后使用typeof查看对象是否显式为long。