当前位置: 首页 > 知识库问答 >
问题:

隐式转换必须显式使用

茹高义
2023-03-14

我有一个结构,下面的运算符声明:

public struct myStruct {
    public static implicit operator int(Nullable<myStruct> m){
        /*...*/
    }
}

仅此运算符就可以将不可为null的结构隐式转换为int,但尝试隐式转换其可为null的对应结构仍会引发编译错误:

无法隐式转换类型myStruct int。存在显式转换(是否缺少演员阵容?)

显然,提到的“显式”操作符实际上是我声明的隐式操作符,完全删除这个操作符也会删除显式操作符。

当谈到可为空的结构时,为什么我被迫显式地使用这个操作符,尽管它被声明为隐式的?

编辑:
这里是“完整代码”,去掉了所有不会使编译器错误消失的东西。结构基本上保持不变,新的是我的测试代码:

using System;

public struct boilDown {
    public static implicit operator int(Nullable<boilDown> s) { return 0; }
} // END Struct

public class Sandbox {
    void Update ()
    {
        boilDown nonNullable = new boilDown ();
        Nullable<boilDown> NullableVersion = new Nullable<boilDown>();

        int MyInt;
        MyInt = nonNullable;        // this work thanks to my operator
        MyInt = NullableVersion;    // But this line requires an explicit cast
    }
}

版本:
你们都暗示了我一个c#版本的问题。我正在研究统一2017.1.0f3,它而不是。Net,使用单声道2.0.50727.1433。(这显然是一个NET3.5等效,但即使是他们的实验性NET4.6等效物也有这个问题。)
我会问他们这个问题,看看他们怎么说。


共有2个答案

强德厚
2023-03-14

感谢所有告诉我这段代码应该编译的人

裴楚青
2023-03-14

您可以像下面这样将NullableVersion显式转换为int

using System;

public struct boilDown {
    public static implicit operator int(Nullable<boilDown> s) { return 0; }
} // END Struct

public class Sandbox {
    static void Main()
    {

    }
    void Update ()
    {
        boilDown nonNullable = new boilDown ();
        Nullable<boilDown> NullableVersion = new Nullable<boilDown>();

        int MyInt;
        MyInt = nonNullable;        // this work thanks to my operator
        MyInt = (int)NullableVersion;    // works now
    }
}
 类似资料:
  • 问题内容: “隐式转换”和“显式转换”有什么区别?Java和C ++的区别是否不同? 问题答案: 显式转换是您使用某种语法 告诉 程序进行转换的地方。例如(在Java中): 隐式转换是在没有任何语法的情况下进行转换的地方。例如(在Java中): 应该注意的是(在Java中)涉及原始类型的转换通常涉及某种表示形式的更改,并且可能导致精度降低或信息丢失。相比之下,仅涉及引用类型的转换不会更改基本表示形

  • 一、隐式转换 1.1 使用隐式转换 隐式转换指的是以 implicit 关键字声明带有单个参数的转换函数,它将值从一种类型转换为另一种类型,以便使用之前类型所没有的功能。示例如下: // 普通人 class Person(val name: String) // 雷神 class Thor(val name: String) { // 正常情况下只有雷神才能举起雷神之锤 def hamm

  • 以下代码在C++11中编译成功: 它包括用于现代C++的JSON。一个工作示例在这个Wandbox中。 JSON变量被隐式转换为字符串。但是,如果我取消最后一行的注释,这是一个显式转换,它将无法编译。这里的编译结果。 除了这个json库的特殊细微差别之外,如何编写一个类,使隐式转换工作,而显式转换不工作? 是否有某种构造函数限定符允许这种行为?

  • 所以,问题是--为什么在I=L的情况下,当L的大小足够小到适合I时,必须显式地进行,但在F=L的情况下,当L的大小也适合F时,铸造可以隐式地进行,而不会产生错误。 我的意思是,在这两种情况下,右操作数的大小可能不适合左操作数。那么,为什么在一种情况下(I=L),强制转换必须显式进行,而在另一种情况下(F=L)可以隐式进行呢?虽然隐式地将长var转换为int var比隐式地将长var转换为浮点var

  • 我在webmatrix上使用经典的asp完成这项工作 在我的数据库中,存储的日期格式为MM/DD/YYYY

  • JavaScript 是非常宽容的,「来者不拒」,不在乎什么类型。 例如,它如果想要接受数字,它并不拒绝其他类型的值,而是试图把它们转换成数字: > '5' - '2' 3 > '5' * '2' 10 自动转换为布尔值通常不会引起问题,而且往往很有用(译注:比如在C语言里,根本就没有布尔类型。 即使如此,这些隐式转换也会引起怪癖(quirks)。 但是当自动转换为字符串时,可能会引起问题。 一