C#中的构造函数的explicit关键字是否有类似内容?它似乎只影响C#中的强制转换操作符。
举个例子:
public Foo( long value )
{
m_value = value;
}
我正在寻找的是使以下代码无法编译的方法:
int bar = 10;
Foo fail = new Foo( bar );
这在C#中是否可行?
答案 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。