C#无强制转换的隐式转换
我正在将VB.net代码转换为C#,我面临一个问题。有了VB.net,我就有了使用对象参数的函数。这些参数通常有两种不同的类型,它们具有我需要的相同方法。例如:C#无强制转换的隐式转换,c#,C#,我正在将VB.net代码转换为C#,我面临一个问题。有了VB.net,我就有了使用对象参数的函数。这些参数通常有两种不同的类型,它们具有我需要的相同方法。例如: Public Sub test(param1 as Object) param1.show() End Sub 对于C#,我执行相同类型的函数,但编译器不接受它 public void test(object param1) { param1.show(); // Error on .show (not found)
Public Sub test(param1 as Object)
param1.show()
End Sub
对于C#,我执行相同类型的函数,但编译器不接受它
public void test(object param1)
{
param1.show(); // Error on .show (not found)
}
我可能应该以某种方式强制转换参数,但我需要向函数发送不同的类型。可能吗?这就是接口存在的原因
public interface IShowable {
void show();
}
class YourClassFromAbove {
public void test(IShowable param1)
{
param1.show();
}
}
传入的任何类型都必须实现解决问题的
IShowable
契约。这就是接口存在的原因
public interface IShowable {
void show();
}
class YourClassFromAbove {
public void test(IShowable param1)
{
param1.show();
}
}
传入的任何类型都必须实现解决该问题的
IShowable
契约。如果使用对象设置选项Strict Off
,则相当于在C中使用dynamic
#
但是,我真的,真的,建议你不要那样做dynamic
是为了帮助编写后期绑定的代码而发明的(这也是引入此功能时VB6中提供的作业Object
),您确实应该使用带有接口的类来获取代码的强类型信息。如果使用对象设置选项Strict Off
,则相当于在C中使用dynamic
#
但是,我真的,真的,建议你不要那样做dynamic
是为了帮助编写后期绑定的代码而发明的(这也是引入此功能时VB6中提供的作业Object
),您确实应该使用带有接口的类来获取代码的强类型信息。或者您可以为每种类型创建单独的函数:
public void test( type1 param1) { param1.show(); }
public void test( type2 param1) { param1.show(); }
public void test(dynamic param1) { param1.show(); } // for the rest of the types
或者,您可以为每种类型创建单独的函数:
public void test( type1 param1) { param1.show(); }
public void test( type2 param1) { param1.show(); }
public void test(dynamic param1) { param1.show(); } // for the rest of the types
为类型定义公共接口或基类,并将其用作参数类型。或者,由于这是一个极其基本的问题,只需为每种类型创建一个test()
重载。这在VB.NET中有效,因为后期绑定(使用选项Strict Off
)是C不允许的。这是一个即使在VB.NET中也可以做但不应该做的事情的例子。如果启用“Option Strict”和“Option Explicit”,您的VB.NET代码将无法编译。。。Igor答案中的接口解决方案适用于两种语言。为类型定义公共接口或基类,并将其用作参数类型。或者,由于这是一个极其基本的问题,只需为每种类型创建一个test()
重载。这在VB.NET中有效,因为后期绑定(使用选项Strict Off
)是C不允许的。这是一个即使在VB.NET中也可以做但不应该做的事情的例子。如果启用“Option Strict”和“Option Explicit”,您的VB.NET代码将无法编译。。。Igor答案中的界面解决方案适用于两种语言。对象
在VB6和VB.NET中是相同的,都是后期绑定的(禁用了选项Strict
)@CoolBots谢谢,我更新了我的答案以消除疑问。即使这对全球变暖不利,我也会使用动态。原因是vb.net代码运行良好,因此在C#中也“应该”运行良好。奇怪的是,我认为后期绑定是多态性的一种进化。像在javascript中一样,使用JSON对象,您不需要强制类型(无论如何,通过强制类型,JSON将没有任何用途)。Object
在VB6和VB.NET中是相同的,两者都是后期绑定的(禁用选项Strict
)@CoolBots谢谢,我更新了我的答案,以消除疑虑。即使这对全球变暖不利,我也会使用dynamic。原因是vb.net代码运行良好,因此在C#中也“应该”运行良好。奇怪的是,我认为后期绑定是多态性的一种进化。就像在javascript中一样,使用JSON对象,您不需要强制类型(无论如何,通过强制类型,JSON将没有任何用途)。