C# Class as one Value in Class // 模仿 int 行为

C# Class as one Value in Class // Mimic int behaviour

有没有办法让我的新 Class 模仿 int 或任何值类型的行为?

我想要一些东西,所以这些作业有效

MyClass myClass = 1;
int i = myClass;
var x = myClass; // And here is important that x is of type int!

MyClass 看起来大致像这样

public class MyClass {
    public int Value{get;set;}
    public int AnotherValue{get;set;}
    public T GetSomething<T>() {..}
}

MyClass 的每个赋值都应该 return 变量 Value 作为 int 类型。

到目前为止,我找到了 implicit operator intimplicit operator MyClass (int value)。但这不是'good enough'.

我希望 MyClass 的行为真的像一个 int。所以 var i = myClassi 成为一个整数。

这可能吗?

如果您创建了从 class 到 int 的强制转换,如下所示:

public static implicit operator int(MyClass instance) { return instance.Value; }

您可以隐含地MyClass 的实例转换为 int:

int i = myClass;

但是你不能期望var-关键字猜测你实际上是指 typeof int 而不是 MyClass,所以这个有效:

var x = myClass;  // x will never be of type int

除此之外,我强烈反对隐式 转换,因为这两种类型没有任何共同点。改为明确:

int i = (int) myClass;

请参阅 this excellent answer from Marc Gravell 了解为什么对隐式转换使用显式转换。基本上它是关于确定在将一个转换为另一个时数据是否会丢失。在您的情况下,您丢失了有关 AnotherValue 的任何信息,因为结果只是原始 int。另一方面,当使用显式强制转换时,您声称:可以转换类型,但是我们可能会丢失原始对象的信息并且不会关心它。

Is this even possible?

没有

您可以隐式和显式地将类型转换和转换为其他类型,但是在没有任何继承或接口实现的情况下让一种类型取代另一种类型违反了面向对象的编程原则。

var 关键字是一种便利的方法,它试图尽可能准确地猜测值的类型。因此当类型为MyClass.

时不能强制表示int

您可能会考虑这样的事情:var x = (int) myClass;