2012-10-24 151 views
1

让我们假设我有下面的类:声明新类型

class Number{ 

} 

我希望再申报Number类型的变量,并给他们就像intuint或任何类型的变量值:

Number n = 14; 

我不知道如果我的问题是好的,但请帮助我,因为我在C#

+0

几乎正是你想要的 - [如何:在结构之间实现用户定义的转换](http://msdn.microsoft.com/en-us/library/zk2z37d3.aspx) –

回答

7

您可以创建小鬼是新手合法的转换运营商来处理这种情况。您的类需要隐式转换运算符将调用的构造函数。例如:

class Number 
{ 
    public int Value { get; set; } 

    public Number(int initialValue) 
    { 
     Value = initialValue; 
    } 

    public static implicit operator Number(int initialValue) 
    { 
     return new Number(initialValue); 
    } 
} 

然后行

Number n = 14; 

将得到有效相当于

Number n = new Number(14); 

您可以将操作添加到类在另一个方向走得太:

public static implicit operator int(Number number) 
{ 
    if (number == null) { 
     // Or do something else (return 0, -1, whatever makes sense in the 
     // context of your application). 
     throw new ArgumentNullException("number"); 
    } 

    return number.Value; 
} 

使用隐式运算符时要小心。它们是很好的语法糖,但它们也可能使得难以分辨特定的代码块中究竟发生了什么。您也可以使用显式运算符,这些运算符需要类型转换才能调用。

+0

你真是太好了!感谢你的伟大exaplanation! – Victor

+0

它还是一个小班,但它将成为一个庞大的班级。我的计划是用更多的“双”操作来制作一种无限精度的数字。 – Victor

+1

好的。如果它代表一个值,你应该使用一个结构而不是一个类。如果你使用一个类,'Number m = n;'意味着'm'和'n'指向同一个'Number'对象 - 可能不是你想要的。如果你使用一个结构体,'Number m = n;'会将'n'的值复制到一个新的实例'm'上。这符合其他原始值类型。 (使用一个结构也意味着键入'Number'的变量不能为空。) – cdhowie

1

你想看看implicit创建一个从int到你的数字类的隐式转换。

1

可以重载在类运营商:

class Number 
{ 
    public static Number operator=(int i) 
    { 
     ... 
    } 
} 

BTW,简单和小班这样,最好使用结构,而不是类。

+3

您不能在C#中重载赋值运算符。 – cdhowie

+0

我最初以为是同样的事情,但是你不能重写'='。您必须改用隐式转换。请参阅[可重载操作符]的列表(http://msdn.microsoft.com/zh-cn/library/8edha89s%28v=vs.80%29.aspx) –