问题标签 [implicit-conversion]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 摆脱错误 C2243
是否有可能摆脱错误 C2243?
我在我的应用程序中遇到了这个错误,最后我设法通过进行显式转换来编译它:
我不明白为什么通过从 B 继承受保护的类 D 会使隐式转换无法访问。
我试图通过在 D 类中创建运算符 B() 来避免显式转换,以使转换可访问:
但是没有办法。
还有其他避免显式转换的解决方案吗?
c# - 带有隐式转换运算符的运行时 InvalidCastException
我有一个内部客户端使用 VB.Net 配置的 C# 库
他们的脚本正在抛出InvalidCastException
他们真正不应该的地方。
所以代码是这样的(大大简化):
然后在他们的 VB.Net 中(再次大量简化):
如果我在隐式/扩展运算符中添加断点,它将永远无法到达。
如果我删除隐式运算符,它将无法编译。
如果我在 C# 中执行等效语句:
奇怪 - 看起来 VB.net 编译器可以找到强制转换运算符,但它在运行时丢失了。VB 和 C# IL 在这里肯定会非常相似吗?
VB.net 代码是动态编译的——编译发生在用户第一次登录应用程序时。它正在针对 .Net 3.5 编译为 VB.Net,我没有使用任何 COM 互操作。
有任何想法吗?
c# - 哪个 Json 反序列化器呈现 IList收藏?
我正在尝试将 json 反序列化为一个对象模型,其中集合表示为IList<T>
类型。
实际的反序列化在这里:
在我发布异常之前,我让你应该知道隐式转换是什么。这是Contact
类型:
这是ContactDetail
类型:
重要的是要知道LazyList<T>
它实现IList<T>
:
现在这个LazyList<T>
类定义很好,直到我尝试将 Json 反序列化到它中。System.Web.Script.Serialization.JavaScriptSerializer
似乎想要将列表序列化为有意义的列表,因为List<T>
它的年龄但我需要它们的类型IList<T>
,以便它们将转换为我的LazyList<T>
(至少那是我认为我出错的地方)。
我得到这个例外:
当我尝试List<ContactDetail>
在我的Contact
类型中使用时(如您在上面所见),它似乎有效。但我不想使用List<T>
's. 我什至尝试让我的LazyList<T>
继承List<T>
似乎执行,但是将List<T>
' 内部传递T[]
给我的实现是一场噩梦,我根本不希望List<T>
我的模型中任何地方都膨胀。
我还尝试了其他一些 json库但无济于事(我可能没有充分利用这些库。我或多或少地替换了引用并尝试重复此问题顶部引用的代码。也许传递设置参数将帮助??)。
我不知道现在该尝试什么。我要使用另一个解串器吗?我是否调整反序列化本身?我需要改变我的类型来取悦反序列化器吗?我是否需要更多地担心隐式转换或只是实现另一个接口?
c++ - C++ 运算符重载和隐式转换
我有一个封装了一些算术的类,比如说定点计算。我喜欢重载算术运算符的想法,所以我写了以下内容:
这一切都有效。我可以写 3 * CFixed(0) 和 CFixed(3) * 10.0f。但现在我意识到,我可以更有效地使用整数操作数来实现 operator*。所以我超载它:
它仍然有效,但现在 CFixed(0) * 10.0f 调用重载版本,将 float 转换为 int (我希望它将 float 转换为 CFixed )。当然,我也可以重载浮点版本,但这对我来说似乎是代码的组合爆炸。是否有任何解决方法(或者我的课程设计错误)?如何告诉编译器仅使用整数调用重载版本的 operator*?
c# - c# 编译器会执行多次隐式转换以从一种类型转换为另一种类型吗?
假设您有自己的课程,如下所示:
然后,您是否能够编写如下代码:
没有它说明没有从字符串到整数的隐式转换?
[是的,我可以自己测试它,但我想我会把它放在那里,看看所有大师都怎么说]
c# - 三元语句中没有隐式 int -> 短转换
这失败了:
错误 CS0266:无法将类型“int”隐式转换为“short”。存在显式转换(您是否缺少演员表?)
谁能解释为什么会这样?我唯一能想到的是编译器不查看第二个值并且不知道两者之间的范围,在这种情况下我写了类似的东西
正确的?唯一的解决办法是丑陋的演员阵容?
此外,似乎 C# 没有短类型的类型后缀。这是一个非常严重的监督 IMO。否则,这将是一个解决方案......
c# - 系统类型; 隐式转换为字符串
在查看代码定义窗口下的System.Type类时,我似乎无法理解如何将此类的实例隐式转换为字符串。例如,在以下代码中:
GetType() 产生的 System.Type 是如何隐式转换为字符串的?
c++ - 使用隐式转换模拟 C++ 函数模板实例化
我已经问了两个 与我正在尝试做的事情相关的问题(一个已解决,一个我将很快关闭)。我知道 C++ 模板实例化不允许任何隐式转换(例如参见此评论),但我想模拟它。
假设我有以下骨架代码:
我希望函数的模板参数f
始终是派生类Base_A
或Adapter
. 限制类型的答案是arg
可以的,但是隐式转换为 Adapter 不行。有没有办法做到这一点?最终结果是我希望能够调用f
为f(A)
or f(B)
,并且在这两种情况下我都需要知道 A 或 B 的实际派生类型f
(f
不能只看到对基类的引用)。
在旁边:
目前,我刚刚开始f(A)
工作,f(B)
实际上调用了一个执行适配器构造的重载,但我还有其他接受 N 个参数的函数,每个参数可以是 A 或 B,所以我需要 2^N 个重载。
出于好奇,这适用于我正在研究的矩阵库。Base_A
表示基本矩阵类型,并Base_B
表示基本矩阵视图类型。对于将修改矩阵参数的操作,我需要通过非常量引用传递矩阵或通过 const-ref 传递可修改的矩阵视图。适配器只是一个简单的矩阵到视图适配器。例如,我目前有一个类似的功能
制作所有这些函数的 2^N 个副本只是为了创建处理视图和非视图所需的重载,既繁琐又容易出错。事实上,这还不够好,因为我希望 Scale 能够知道 Mview 的完整派生类型,而不仅仅是基类,因为我可能会生成依赖于 Mview 的类型的实例。
编辑 1:将所有 B 类型更改为具有非常量接口函数。这是最初的意图,因此对任何混淆表示歉意。
编辑 2:有这个工作代码,仍然需要 2^N 重载,但我可以忍受它,除非有人建议如何处理它。
c++ - C++模板和歧义问题
我有一个指针类的子集,如下所示:
最后一个构造函数的目标是允许传递一个Pointer
子类,或者基本上任何可以隐式转换为的类型T *
。此实际规则仅由构造函数的定义强制执行,编译器无法仅通过声明来确定它。如果我放弃它,并尝试将 a 传递Pointer<Sub>
给 的构造函数Pointer<Base>
,我会得到一个编译错误,尽管可能通过operator T *()
.
虽然它解决了上述问题,但它创造了另一个问题。如果我有一个重载函数,其一个重载采用 a Pointer<UnrelatedClass>
,另一个采用Pointer<BaseClass>
,并且我尝试使用 a 调用它Pointer<SubClass>
,我会在两个重载之间产生歧义,当然,目的是调用后一个重载。
有什么建议么?(希望我足够清楚)
asp.net-mvc - 无效的强制转换异常,即使我定义了隐式强制转换运算符(在 asp mvc 应用程序中)
我创建了一个 mvc 模型类,其中一个属性是“MyObject”类型。它还有一个 System.ComponentModel.DataAnnotations.StringLength 属性。
MyObject 作为隐式转换运算符,因此它基本上可以用作字符串:
这是出于某种奇怪原因的asp mvc问题吗?我问是因为我知道在大多数情况下隐式强制转换工作正常,例如我可以将该属性分配给一个字符串值,它工作得很好。
编辑-好的,我知道为什么会发生错误:
这是因为 StringLength.IsValid() 方法将对象作为参数,所以转换实际上是从对象到字符串,而不是从 MyObject 到字符串,所以这解释了为什么我未调用隐式转换运算符。但是如何解决这个问题?
这一切都很好,直到我将 System.ComponentModel.DataAnnotations.StringLength 属性放在我的模型中的属性上,然后当视图从提交按钮发布时,我得到了异常:
[InvalidCastException:无法将“StrataSpot.Shared.Models.Email”类型的对象转换为“System.String”类型。]
System.ComponentModel.DataAnnotations.StringLengthAttribute.IsValid(对象值)+34
System.Web.Mvc.d__1。 MoveNext() +56 System.Web.Mvc.DefaultModelBinder.OnPropertyValidated(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor, Object value) +203 System.Web.Mvc.DefaultModelBinder.BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor) +413
System.Web.Mvc.DefaultModelBinder.BindProperties(ControllerContext controllerContext, ModelBindingContext bindingContext) +90
System.Web.Mvc.DefaultModelBinder.BindComplexElementalModel(ControllerContext controllerContext, ModelBindingContext bindingContext, 对象模型) +383
System.Web.Mvc.DefaultModelBinder.BindComplexModel(ControllerContext controllerContext, ModelBindingContext bindingContext) +1048
System.Web.Mvc.DefaultModelBinder.BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) +280
System.Web.Mvc.ControllerActionInvoker.GetParameterValue(ControllerContext controllerContext, ParameterDescriptor parameterDescriptor) +257
System.Web.Mvc.ControllerActionInvoker.GetParameterValues(ControllerContext controllerContext, ActionDescriptor actionDescriptor) +109
System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +314 System.Web.Mvc.Controller.ExecuteCore() +105 System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +39
System.Web. Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) +7
System.Web.Mvc.<>c__DisplayClass8.b__4() +34 System.Web.Mvc.Async.<>c__DisplayClass1.b__0() + 21 System.Web.Mvc.Async.<>c__DisplayClass81.<BeginSynchronous>b__7(IAsyncResult _) +12 System.Web.Mvc.Async.WrappedAsyncResult
1.End() +59 System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +44
System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest( IAsyncResult 结果)+7
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +8678910 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155