标签: implicit-conversion

转换为自定义类型时,隐式运算符出错

当我尝试将返回类型转换为对象或我自己定义的一个自定义类型时,为什么隐式运算符会出现问题?

我有当我尝试转换并返回一个简单类型就像一个没有问题的int,像这样的

public static implicit operator int(MyClass a)
        {
            return 123;
        }
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试将类型转换为对象或自定义类型时,我将收到错误.例如,如果我有这样的事情,我将得到编译时错误" 用户定义的转换为System.Object ":

public static implicit operator object(MyClass a)
{
   return new {};
}
Run Code Online (Sandbox Code Playgroud)

如果我有这个,我会得到同样的错误:

public static implicit operator CustomTestObject(MyClass a)
{
   return new CustomTestObject();
}
Run Code Online (Sandbox Code Playgroud)

当使用隐式运算符时,如何将其转换为我自己的自定义类型以便返回?

c# implicit-conversion

0
推荐指数
1
解决办法
413
查看次数

隐式类型转换 - Int为double

我有一个大学的练习,看起来像:

int a = 10;
int b = 3;

double c = a / b;
Run Code Online (Sandbox Code Playgroud)

问题是:哪个值是c.

现在我想说,c是3.3.在计算结果之前,它被隐式转换为double.但是这个问题的正确答案是根据我的记录3.0.

怎么会这样?编译器是否真的首先将结果计算为整数,然后在第二步中将其转换为加倍?

或者我是否理解错误?

java casting implicit-conversion

0
推荐指数
1
解决办法
250
查看次数

C# - 创建一个固定大小的'var'数组?

我正在尝试创建一个具有固定长度的var类型的数组.我在我创建的var Linked List类中使用它.我知道我想要创建的数组的大小,不知道什么是正确的语法?

这是代码:

public dynamic ToArray()
{
    int counter = 0;

    if (this.head == null)
        return null;
    else
        counter = 1;

    ListEntry i = this.head;
    while (i.Next != null)
    {
        counter++;
        i = i.Next;
    }

    var array = new[counter];

    i = this.head;
    for (int j = 0; j < array.Length; j++)
    {
        array[j] = i.Data;
        i = i.Next;
    }

    return array;
}
Run Code Online (Sandbox Code Playgroud)

这部分不起作用:

var array = new[counter];
Run Code Online (Sandbox Code Playgroud)

有帮助吗?

编辑:感谢大家的投入.我必须承认,当我发布时,我对语法糖的术语知之甚少.它现在更有意义.

这篇文章背后的想法是创建一个可以处理基本值类型的动态Linked List类.

c# arrays dynamic implicit-conversion

0
推荐指数
1
解决办法
1万
查看次数

返回函数返回一个shared_ptr的新东西

我有一个函数将shared_ptr返回给const对象.返回由operator new返回的指针构造的shared_ptr,但返回该指针会导致编译错误:

Error   3   error C2664: 'std::shared_ptr<_Ty>::shared_ptr(std::nullptr_t)' : cannot convert parameter 1 from 'script::float_data *' to 'std::nullptr_t'    c:\xxx\value.cpp    59
Run Code Online (Sandbox Code Playgroud)

以下是导致错误的代码:

shared_ptr< const data > float_data::operator + ( shared_ptr< const data > rhs ) const
{
    int rhs_as_int; float rhs_as_float;

    switch( rhs->to_numeric( rhs_as_int, rhs_as_float ) )
    {
    case E_INT:
        return new float_data( val + rhs_as_int );
    case E_FLOAT:
        return new float_data( val + rhs_as_float );
    }
}
Run Code Online (Sandbox Code Playgroud)

这些课程是:

class data
{
public:

    enum type
    {
        E_INT,
        E_FLOAT,
        E_STRING
    };

public:

    virtual …
Run Code Online (Sandbox Code Playgroud)

c++ constructor return shared-ptr implicit-conversion

0
推荐指数
1
解决办法
598
查看次数

是"!" intsead"== 0"来检查int是0是好的做法吗?

假设我们有一个变量a:

int a = 0;
Run Code Online (Sandbox Code Playgroud)

可以吗

if(!a)
{
    // do some stuff
}
Run Code Online (Sandbox Code Playgroud)

代替

if(a == 0)
{
    // do some stuff
}
Run Code Online (Sandbox Code Playgroud)

?因为它有效.

在第一个例子中,int将变成一个bool,所以没有它可以static_cast<bool>(a)吗?如果a大于1 会发生什么?

c++ type-conversion implicit-conversion

0
推荐指数
1
解决办法
76
查看次数

为什么int被提升为double而不是float用于隐式转换

我目前正在学习C++思想C++入门.在关于类型转换的第4.11章中,我注意到本章很少讨论从积分到浮点类型的隐式转换,但实际上主要集中在积分类型内的转换.因此,我不确定从整数类型到浮点类型的转换规则.

我的问题来自章节的例子:

int ival = 3.541 + 3
Run Code Online (Sandbox Code Playgroud)

该章提到double在添加3.541之前将3转换为类型.

问题源于这样一个事实:对于大多数整数类型,int除非它们无法适应,否则它们在隐式转换期间大多被提升int.由于intfloat两个相同大小的4个字节,而3.0和3.541可以完美配合到float,为什么高阶double在这种情况下,用于隐式转换,而不是float?这是否意味着对于任何整数类型到浮点类型的隐式转换,double无论精度或大小如何,整数类型都将转换为a ?

谢谢你!

c++ floating-point double implicit-conversion

0
推荐指数
1
解决办法
819
查看次数

不能隐式将类型SqlBoolean转换为bool,或者可以吗?

请考虑以下代码行:

System.Data.SqlTypes.SqlBoolean sb = true; // (1)

bool b = sb; // (2)

bool b = sb ? true : false; // (3)

if (sb) // (4)
{

}
Run Code Online (Sandbox Code Playgroud)

(1)工作正常,我猜是因为public static implicit operator SqlBoolean(bool x).

(2)给我以下错误(CS0266):

无法将类型'System.Data.SqlTypes.SqlBoolean'隐式转换为'bool'.存在显式转换(您是否错过了演员?)

据我所知,从转换boolSqlBoolean是明确的(public static explicit operator bool(SqlBoolean x)),可能是因为SqlBoolean.IsNull可能是真实的.

但那为什么(3)(4)有效呢?这些看起来像隐式转换.

c# .net-4.0 implicit-conversion

0
推荐指数
1
解决办法
1015
查看次数

结构化类和反向隐式转换

假设我有一个结构和一个具有相同成员的类:

using System;

class app
{
    static void Main()
    {
        foo f = new foo() { a  = 4, b = 7 };
        bar b = f;
        Console.WriteLine(b.a);
        Console.ReadKey();
    }

    struct foo
    {
        public int a { get; set; }
        public uint b { get; set; }
    }

    class bar
    {
        public int a { get; set; }
        public uint b { get; set; }

        public static implicit operator foo(bar b)
        {
            return b;
        }

        public static implicit operator bar(foo …
Run Code Online (Sandbox Code Playgroud)

c# implicit-conversion

0
推荐指数
1
解决办法
53
查看次数

为什么std :: array没有运算符T *?

对于C数组,通常情况下,简单地命名数组与编写&foo[0]将近50年的东西具有相同的效果。

在我正在处理的项目中,从C样式数组转换为std :: array <>时,出现的绝大多数“错误”是由于C数组的上述属性所致。

在所有情况下,解决方案都很简单,只需追加即可.data()。但是,我想到精心设计operator T*应该可以直接解决这个问题。

有任何技术原因无法创建此运算符?

c++ language-lawyer implicit-conversion c++11 stdarray

0
推荐指数
1
解决办法
155
查看次数

指针类型的char数组的反向引用

我是这门C语言的新手。在研究char数组时,我有一个问题。

我知道一个指向数组的指针是数组的第一个元素的地址。下面的代码是完美的:

char* c1 = "test"
printf("%s\n",c1); =>[output] "test"
Run Code Online (Sandbox Code Playgroud)

但是我认为那c1是字母“ t”的地址,例如“ 00x1928”。因此,*c1是对以下内容的反向引用c1

char* c1 = "test"
printf("%s\n",*c1) => error!
Run Code Online (Sandbox Code Playgroud)

为什么此代码是错误的?

c arrays pointers implicit-conversion

0
推荐指数
1
解决办法
54
查看次数