C# "Boxing"通过赋值进入属性/1-Arg 构造函数

标签 c#

在 C# 中,假设您有一个简单的类:

public class MyFloat
{
    public float Value { get; set; }

    public MyFloat()
    {}

    public MyFloat(float _Value)
    {
        Value = _Value;
    }
}

是否存在这样的语法,允许您将其 Value 属性简写为如下内容:

MyFloat[] Arg_f;
Arg_f = new MyFloat[] { 1, 2, 3 };

而不是需要显式调用构造函数,例如:

Arg_f = new MyFloat[] { new MyFloat(1), new MyFloat(2), new MyFloat(3) };

或等效地,即

MyFloat myFloat = 5f;          //Implicitly assign 5f to myFloat.Value
float myFloatValue = myFloat;  //Implicitly get myFloat.Value

这显然类似于装箱/拆箱,只是我试图“装箱”到特定的对象属性中。或者你可能会说我正在尝试通过赋值隐式调用 1-arg 构造函数。

这样的事情在 C# 中是否可行,或者我只是在徒劳地追逐?

最佳答案

这可以通过 implicit conversion 来实现:

public static implicit operator MyFloat(float f)
{
      return new MyFloat(f);
}

现在这将起作用:

 var myFloats = new MyFloat[] { 1, 2 };

This is obviously similar to boxing/unboxing, except that I'm trying to "box" into a specific object property.

这与装箱无关,而是关于将一​​种类型隐式转换为另一种类型的能力,因为您不需要显式类型声明。

就我个人而言,虽然可能,但我不喜欢使用隐式转换。它们会导致歧义(“这是如何转换为 MyFloat 的?”)并且可能会让开发人员在阅读代码库时感到惊讶。

关于C# "Boxing"通过赋值进入属性/1-Arg 构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33246783/

相关文章:

c# - 运行时编译错误

c# - DateTime.ParseExact 返回当前日期

c# - 我可以在 C# 中声明一个接口(interface)方法来返回泛型接口(interface)吗?

c# - 架构中的服务层 - DLL?

c# - 重复子串 N 次

c# - 异步 HttpWebRequest

java - 如何获取 SunAwtFrame 窗口处理程序

c# - 声明具有复杂类型约束的继承泛型

c# - 有没有办法在 .NET 中进行 'correct' 算术舍入?/C#

C#字典,如何获取特定值