我正在尝试在c#中创建ufloat类/结构。对我来说,这更是一个挑战,但可以帮助我控制代码中的某些值。在尝试了几种方法之后,我终于有了一种可行的方法:
public struct ufloat
{
public float value
{
get{ return value; }
set
{
if(value < 0)
{
this.value = 0;
}
else
{
this.value = value;
}
}
}
}
问题是,我希望它的行为类似于典型的基本类型:
ufloat n = 5;
n += 1;
经过一番思考,我尝试重载'='运算符,但这是不可能的。现在我没主意了。这就是为什么我问,你怎么改变这个:
ufloat x; x.value = 1;
对此:
ufloat x = 0; x = 1;
?
(很抱歉,如果我真的失去了一些简单的东西,但是我是一个自学成才的“程序员”,并且对c#还是陌生的。我起初是学习c ++的,从低级转到高级对我来说并不容易)
答案 0 :(得分:5)
您不能重载=
运算符,但是可以重载+
运算符,然后重载+=
运算符(我相信您的意思不是=+
)将以合理明显的方式工作。不过,您还需要将float
的隐式转换添加到您的结构中。
我强烈建议不要使结构可变-而是让+
运算符返回一个 new 值。这将使其表现得与其他所有基本类型一样,并且与大多数其他结构一样。我还要将其重命名为USingle
,以遵循常规的.NET命名约定(其中Single
是float
的CLR名称)。您不能为float
这样的名称添加自己的C#别名。
我怀疑您的类型会想要
Single
的构造函数float
之间的转换(请注意,通常隐式转换不应引发异常-您也许可以忽略它,但我不确定...)float
,+
,-
和*
的重载)/
,ToString
和Equals
GetHashCode
和IComparable<USingle>
的实现如果您将两个“大正浮点数”值加在一起,则应该考虑要发生什么-意图是您的新类型能够支持比IEquatable<USingle>
更大的正值,或者是只是“ float
,但总是非负的?”
答案 1 :(得分:0)
您不能重载=
运算符,但可以编写隐式强制类型转换,例如,这是用于强制转换int的类型:
public class ufloat
{
public float value { get; }
public ufloat(int val) { value = Math.Abs(val); }
public static implicit operator ufloat(int input)
{
return new ufloat(input);
}
}
现在,如果您为其分配一个int值,它将隐式转换为ufloat:
ufloat x = -5;