Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#无强制转换的隐式转换_C# - Fatal编程技术网

C#无强制转换的隐式转换

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)

我正在将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 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将没有任何用途)。