C# 我可以使用=运算符指定构造函数值吗?

C# 我可以使用=运算符指定构造函数值吗?,c#,constructor,operators,C#,Constructor,Operators,在C#中生成字符串时,您需要执行string foo=“bar”字符串是一个类,并且使用=运算符将值“bar”传递给该类。那是怎么做到的?你能在自己班上做这个吗 我知道在C++中是可行的。 class someClass { public: someClass(int someInt) { // Do Stuff } }; int main() { someClass classInst = 123; } 但C#等价物是什么 这个问题有两个部分:

在C#中生成字符串时,您需要执行
string foo=“bar”字符串是一个类,并且使用
=
运算符将值“bar”传递给该类。那是怎么做到的?你能在自己班上做这个吗

<>我知道在C++中是可行的。
class someClass {
public:
    someClass(int someInt) {
        // Do Stuff
    }

};

int main() {
    someClass classInst = 123;
}

但C#等价物是什么

这个问题有两个部分:

  • 字符串文字如何工作
  • 如何为自己的班级做同样的事情
字符串文本

表达式
“bar”
已经是
字符串类型的值。这里的赋值运算符只是复制引用,就像它复制其他任何对象一样。字符串文字导致尽可能创建字符串对象(但重复使用,因此如果循环中有该代码,则只有一个
String
对象)。关于
FormattableString
,插值字符串文本有一些微妙之处,但出于本问题的目的,我将忽略这一点


创建自己的文本式语法

不能让赋值运算符直接隐式调用构造函数。可以添加从
int
SomeClass
的隐式转换,但我通常不鼓励这样做

这里有一个完整的例子,以防你真的想这么做,但它确实不是惯用语。例如,当您进行隐式转换时,您就更难对重载解析进行推理,而任何阅读您的代码的人都必须知道存在用户定义的隐式转换

using System;

class SomeClass
{
    public int Value { get; }

    public SomeClass(int value) => Value = value;

    public static implicit operator SomeClass(int value) =>
        new SomeClass(value);
}

public class Program
{
    static void Main()
    {
        SomeClass x = 123;
        Console.WriteLine(x.Value);
    }
}
请注意,如果该功能在C#8中通过,您将能够编写:

SomeClass x = new(123);

。。。因此,您至少应该将复制保存在那里,即使对于字段也是如此。

您可以定义两种类型之间的隐式转换:
int
SomeClass
,如下所示:

// User-defined conversion from SomeClass to int
public static implicit operator int(SomeClass someClass)
{
    return someClass.SomeInt;
}
//  User-defined conversion from int to SomeClass
public static implicit operator SomeClass(int someInt)
{
    return new SomeClass(someInt);
}
这些方法应该在
SomeClass
声明中定义

有关隐式转换的更多信息,请检查此项