C# 类作为类中的一个值 // 模仿 int 行为

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

提问人:CanereCurrere 提问时间:11/15/2017 最后编辑:spenderCanereCurrere 更新时间:11/16/2017 访问量:613

问:

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

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

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 的每个赋值都应将 Variable 作为 int 类型返回。Value

到目前为止,我发现和.但这还不够“好”。implicit operator intimplicit operator MyClass (int value)

我希望 realy 表现得像一个 int。所以让我们成为一个 int。MyClassvar i = myClassi

这甚至可能吗?

C# 变量赋值 赋 运算符 类型

评论

5赞 spender 11/15/2017
var x = myClass; // And here is important that x is of type int!我认为这永远不会飞。
0赞 Sinatr 11/15/2017
@spender,?implicit operator int
1赞 Tobias Theel 11/15/2017
类永远不会像结构体°°那样运行,因为它是引用类型而不是值类型。您可以使用结构体并覆盖运算符。使对象的行为类似于整数
1赞 spender 11/15/2017
@Sinatr正如 OP 所讨论的,这不适用于 .TBH,尝试这样做对我来说真的没有多大意义......考虑到用例,它可以隐式转换为 int,因此可以(在大多数地方)代替 int。 OP,你为什么希望这样?var x = myClass
3赞 DavidG 11/15/2017
@Sinatr 因为 ,x 永远不会是 的类型。var x = myClassmyClass

答:

1赞 MakePeaceGreatAgain 11/15/2017 #1

如果您已将从类转换为 int 的强制转换,如下所示:

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

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

int i = myClass;

但是,你不能指望 -关键字会猜到你实际上指的是 typeof 而不是 ,所以这不起作用varintMyClass

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

除此之外,我强烈建议不要使用隐式演员,因为这两种类型没有任何共同点。改为显式:

int i = (int) myClass;

请看 Marc Gravell 的这个精彩回答,了解为什么使用显式投射而不是隐式投射。基本上,这是关于确定在将一个转换为另一个时是否会丢失数据。在你的例子中,你丢失了任何关于 的信息,因为结果只是一个原语。另一方面,当使用显式强制转换时,您声称:类型可以转换,但是我们可能会丢失原始对象的信息,并且不会关心这一点。AnotherValueint

0赞 Kyle Delaney 11/15/2017 #2

这甚至可能吗?

不。

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

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

你可以考虑这样的事情:var x = (int) myClass;

评论

0赞 Servy 11/16/2017
The var keyword is a convenience that tries to guess the type of a value with as much precision as possible.那不是真的。它什么都猜不到。它只是使变量的类型是初始化它的表达式的类型,并且每个表达式都有一个明确的类型。任何地方都不涉及猜测。这只是一种方便,可以防止您写出变量的类型。
0赞 Kyle Delaney 11/16/2017
嗯,你是对的。“猜测”这个词是一个糟糕的选择。我试图传达当一个变量很容易在继承层次结构上具有多种类型时,关键字可能具有的歧义。var
0赞 Servy 11/16/2017
同样,使用 初始化的任何变量的类型都没有歧义。类型始终是分配给它的表达式的类型,并且每个表达式始终具有明确的类型。var
0赞 Kyle Delaney 11/16/2017
再次感谢。我的意思是从设计的角度来看模棱两可。如果您没有使用,则可以从任何给定变量的几种不同类型中进行选择。var