标签: implicit-conversion

关于c#中隐式运算符重载的问题

MyClass c = 10;
Run Code Online (Sandbox Code Playgroud)

有没有办法使这个代码工作?我知道通过隐式运算符重载你可以得到相反的工作:

int i = instanceOfMyClass;
Run Code Online (Sandbox Code Playgroud)

谢谢

c# operator-overloading implicit-conversion

2
推荐指数
1
解决办法
290
查看次数

多态性,自动装箱和隐式转换

你会认为Java中的autoboxing是一种多态吗?换句话说,你认为autoboxing扩展了Java的多态能力吗?

Scala中的隐式转换怎么样?

我的观点是它们都是多态性的例子.这两个特征允许以统一的方式处理不同数据类型的值.

我的同事不同意我的看法.谁是对的?

java polymorphism autoboxing scala implicit-conversion

2
推荐指数
1
解决办法
637
查看次数

隐式构造函数转换的编译器优化

在下面的代码中,我期望调用A的构造函数,然后是A的复制构造函数.然而,事实证明只有构造函数被调用.

// MSVC++ 2008
class A
{
public:
   A(int i):m_i(i)
   {
      cout << "constructor\n";
   }
   A(const A& a)
   {
      m_i = a.m_i;
      cout << "copy constructor\n";
   }

private:
   int m_i;
};

int main()
{
   // only A::A() is called
   A a = 1;
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

我猜编译器是足够聪明的优化掉了第二个电话,来初始化对象一个直接的构造.那么它是标准定义的行为还是只是实现定义的?

c++ constructor implicit-conversion

2
推荐指数
1
解决办法
366
查看次数

如何为我的Scala类定义强制转换和隐式强制转换操作?

例如,我想让它以设置jDName为"John Doe"和jDAge32的方式工作:

case class Person(name : String, surname : String, age : Int)

val johnDoe = Person("John", "Doe", 32)

val jDName : String = johnDoe

val jDAge : Int = johnDoe
Run Code Online (Sandbox Code Playgroud)

我可以在Person类中编写函数来提供对String,Int和其他(自定义)类型的隐式转换吗?另一件事是显式的强制转换操作 - 也很有趣,但我不确切地知道如何在Scala中编写这个例子.

casting scala implicit implicit-cast implicit-conversion

2
推荐指数
1
解决办法
4372
查看次数

是否可以为SecureString创建显式或隐式运算符以进行字符串转换?

我已经对各种转换方法进行了一些研究,并且已经使用了explicit或者implicit operators.

注意到它System.Security.SecureString是一个sealed类(它不能从中继承),是否可以编写一个explicit或者implicit operator能够在a System.Security.SecureString和a 之间执行转换System.String(利用此处描述的方法).

例如,我知道你必须operator在被转换对象的(部分)类中编写.因此,我认为最好的方法是继承该类,并编写必要的operators.

是否有可能a)使用的执行转换explicitimplicit operatorSystem.Security.SecureStringSystem.String,B)执行一个类的对象是谁的类是转换sealed

如果没有,除了使用类方法之外还有另一种方法可以执行转换吗?

假设我是微软产品的消费者,请提供实用的答案.

c# syntax accessor type-conversion implicit-conversion

2
推荐指数
1
解决办法
378
查看次数

C#jagged array:编译器不能隐式地将类型'char []'转换为'int []'.为什么?

由于C#编译器可以隐式地将类型'char'转换为'int',我预计它也会将类型'char []'隐含地转换为'int []'.

但是,以下代码返回编译时错误CS0029无法将类型'char []'显式转换为'int []'.

int[][] jaggedArray = new int[][]
{
  new[]{'a'},
  new[]{1}
};
Run Code Online (Sandbox Code Playgroud)

是否有技术原因导致无法提供此转换?

c# int jagged-arrays char implicit-conversion

2
推荐指数
1
解决办法
597
查看次数

返回HelpText类而不是字符串意外地工作

我正在使用CommandLine ParserAPI来处理我的应用程序的命令行参数.

示例页面中,有一段代码:

 [HelpOption]
  public string GetUsage() {
    return HelpText.AutoBuild(this, (HelpText current) => HelpText.DefaultParsingErrorsHandler(this, current));
  }
Run Code Online (Sandbox Code Playgroud)

它确实编译.

但是,实际上返回值HelpText.AutoBuild()是HelpText实例,它继承了immediatly对象.而且,AFAIK,string是一个密封类,不能继承.

怎么会这样?

c# implicit-conversion

2
推荐指数
1
解决办法
244
查看次数

Scala:使用隐式证据的泛型方法无法编译

我正在通过"Scala for the Impatient"一书中的练习来学习Scala.一个问题是:

给定一个可变Pair[S, T]类,使用类型约束来定义一个交换方法,如果类型参数相同,则可以调用该方法.

我的代码:

class Pair[T, S](var first: T, var second: S) {
  def swap(implicit ev: T =:= S) {
    val temp = first
    first = second // doesn't compile
    second = temp
  }
}
Run Code Online (Sandbox Code Playgroud)

上面的代码失败,并抱怨编译firstsecond是不同的类型.好吧,我很好地告诉编译器他们不是.怎么能告诉它闭嘴?

generics types scala implicit-conversion

2
推荐指数
1
解决办法
420
查看次数

最佳可行的转换功能

在以下程序中,应选择哪个(如果有)转换功能,为什么?

int r;
struct B {};
struct D : B {};
struct S {
  D d;
  operator D&(){r=1; return d;} // #1
  operator B&(){r=2; return d;} // #2
};
int main() {
  S s;
  B& b = s;
  return r;
}
Run Code Online (Sandbox Code Playgroud)

gcc和clang选择均选择转换功能#2。但为什么?

标准

(1)在[dcl.init.ref]中指定的条件下,可以将引用直接绑定到将转换函数应用于初始化程序表达式的结果。重载解析用于选择要调用的转换函数。假设“对cv1 T的引用”是要初始化的引用的类型,而“ cv S”是初始化程序表达式的类型,其中S为类类型,则按以下方式选择候选函数:

(1.1)-考虑S的转换函数及其基类。那些未隐藏在S中且产生类型“对cv2 T2的左值引用”(初始化对函数的左值引用或右值引用时)或“ cv2 T2”或“对cv2 T2的右值引用”的非显式转换函数将右值引用或左值引用初始化为函数),其中“ cv1 T”与“ cv2 T2”的引用兼容)是候选函数。对于直接初始化,未隐藏在S中的那些显式转换函数会产生类型“对cv2 T2的左值引用”(初始化对函数的左值引用或右值引用)或“对cv2 T2的右值引用”(当初始化对函数的右值引用或左值引用),

(2)参数列表有一个参数,它是初始化器表达式。[?注:此参数将与转换函数的隐式对象参数进行比较。-?尾注?]

这里我们有两个候选函数#1和#2。两者都可行-如果删除其中之一,程序仍会编译。这两个转换函数仅采用隐式参数,并且具有相同的cv和ref限定。因此,没有一个应该是最可行的,并且该程序也不应编译。为什么编译?

c++ language-lawyer overload-resolution implicit-conversion reference-binding

2
推荐指数
1
解决办法
82
查看次数

std :: filesystem :: path和std :: string之间的隐式转换,应该发生吗?

状态的cppreference页面std::filesystem::path

路径可以隐式转换为from和from std::basic_strings,因此可以将它们与over files API一起使用,例如,作为std::ifstream::open

现在,转换为a std::filesystem::path很容易,因为它具有采用std::string类型的非显式构造函数。但是,我似乎找不到的是一种std::string隐式地进行查找的方法。

有一个string功能,但是std::string string() const;没有operator std::string()。使用

#include <filesystem>

void foo(std::string) {}

int main()
{
    namespace fs = std::filesystem;
    fs::path p1;
    foo(p1);
}
Run Code Online (Sandbox Code Playgroud)

这段代码可以使用iccgccclang很好地编译,但是不能使用MSVS编译,但会给出错误:

example.cpp

<source>(10): error C2664: 'void foo(std::string)': cannot convert argument 1 from 'std::filesystem::path' to 'std::string'

<source>(10): note: No user-defined-conversion operator available that can perform this conversion, or the operator cannot …
Run Code Online (Sandbox Code Playgroud)

c++ path language-lawyer implicit-conversion std-filesystem

2
推荐指数
2
解决办法
120
查看次数