当我尝试将返回类型转换为对象或我自己定义的一个自定义类型时,为什么隐式运算符会出现问题?
我有当我尝试转换并返回一个简单类型就像一个没有问题的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)
当使用隐式运算符时,如何将其转换为我自己的自定义类型以便返回?
我有一个大学的练习,看起来像:
int a = 10;
int b = 3;
double c = a / b;
Run Code Online (Sandbox Code Playgroud)
问题是:哪个值是c.
现在我想说,c是3.3.在计算结果之前,它被隐式转换为double.但是这个问题的正确答案是根据我的记录3.0.
怎么会这样?编译器是否真的首先将结果计算为整数,然后在第二步中将其转换为加倍?
或者我是否理解错误?
我正在尝试创建一个具有固定长度的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类.
我有一个函数将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) 假设我们有一个变量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++思想C++入门.在关于类型转换的第4.11章中,我注意到本章很少讨论从积分到浮点类型的隐式转换,但实际上主要集中在积分类型内的转换.因此,我不确定从整数类型到浮点类型的转换规则.
我的问题来自章节的例子:
int ival = 3.541 + 3
Run Code Online (Sandbox Code Playgroud)
该章提到double在添加3.541之前将3转换为类型.
问题源于这样一个事实:对于大多数整数类型,int除非它们无法适应,否则它们在隐式转换期间大多被提升int.由于int与float两个相同大小的4个字节,而3.0和3.541可以完美配合到float,为什么高阶double在这种情况下,用于隐式转换,而不是float?这是否意味着对于任何整数类型到浮点类型的隐式转换,double无论精度或大小如何,整数类型都将转换为a ?
谢谢你!
请考虑以下代码行:
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'.存在显式转换(您是否错过了演员?)
据我所知,从转换bool到SqlBoolean是明确的(public static explicit operator bool(SqlBoolean x)),可能是因为SqlBoolean.IsNull可能是真实的.
但那为什么(3)和(4)有效呢?这些看起来像隐式转换.
假设我有一个结构和一个具有相同成员的类:
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数组,通常情况下,简单地命名数组与编写&foo[0]将近50年的东西具有相同的效果。
在我正在处理的项目中,从C样式数组转换为std :: array <>时,出现的绝大多数“错误”是由于C数组的上述属性所致。
在所有情况下,解决方案都很简单,只需追加即可.data()。但是,我想到精心设计operator T*应该可以直接解决这个问题。
有任何技术原因无法创建此运算符?
我是这门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)
为什么此代码是错误的?