【问题标题】:C# Class as one Value in Class // Mimic int behaviourC# Class as one Value in Class // 模仿 int 行为
【发布时间】:2017-11-15 15:37:26
【问题描述】:

有没有办法让我的新类模仿 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 的每个赋值都应该返回变量 Value 作为类型 int。

到目前为止,我找到了 implicit operator intimplicit operator MyClass (int value)。但这还不够好。

我希望 MyClass 真正表现得像一个 int。所以var i = myClassi 成为一个int。

这可能吗?

【问题讨论】:

  • var x = myClass; // And here is important that x is of type int! 我不认为这会飞。
  • @spender, implicit operator int ?
  • 一个类的行为永远不会像结构°°,因为它是引用类型而不是值类型。您可以使用结构并覆盖运算符。让你的对象表现得像一个整数
  • @Sinatr 正如 OP 所讨论的,这对var x = myClass 不起作用(也不会)。 TBH,尝试这样做对我来说并没有多大意义......考虑到用例,它可以隐式转换为 int,因此可以(在大多数地方)使用而不是 int。 OP,你为什么要这样?
  • @Sinatr 因为var x = myClass,x 永远不会是myClass 以外的任何类型。

标签: c# operators variable-assignment assignment-operator value-type


【解决方案1】:

如果你创建了一个从你的类到 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。另一方面,当使用显式转换时,您声称:类型可以转换,但是我们可能会丢失原始对象的信息并且不会在意。

【讨论】:

    【解决方案2】:

    这可能吗?

    没有。

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

    var 关键字是一种便利,它试图以尽可能高的精度猜测值的类型。因此,当类型为MyClass时,不能强制表示int

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

    【讨论】:

    • The var keyword is a convenience that tries to guess the type of a value with as much precision as possible. 这不是真的。它什么都猜不到。它只是使变量的类型成为初始化它的表达式的类型,并且每个表达式都有一个明确的类型。任何地方都不涉及猜测。这只是为了方便您写出变量的类型。
    • 嗯,你是对的。 “猜测”这个词是一个糟糕的选择。我试图传达var 关键字在继承层次结构上很容易具有多种类型时可能具有的歧义。
    • 同样,使用var 初始化的任何变量的类型都没有歧义。类型始终是分配给它的表达式的类型,并且每个表达式始终具有明确的类型。
    • 再次感谢。从设计的角度来看,我的意思是模棱两可。如果你没有使用var,你可以为任何给定的变量选择几种不同的类型。
    猜你喜欢
    • 1970-01-01
    • 2017-02-26
    • 2016-09-09
    • 2011-11-30
    • 2019-07-30
    • 1970-01-01
    • 2022-12-27
    • 2020-05-29
    • 1970-01-01
    相关资源
    最近更新 更多