Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.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语言中的类型转换问题#_C#_Casting - Fatal编程技术网

C# c语言中的类型转换问题#

C# c语言中的类型转换问题#,c#,casting,C#,Casting,我有两门课: class A { public void A_1(Object b) { ... Type t = b.GetType(); (t.FullName)b.B_1(); //It doesn`t work! Error in cast } .... } class B { public void B_1() { ... } .... } A a = new A();

我有两门课:

class A {
    public void A_1(Object b) {
        ...
        Type t = b.GetType();
        (t.FullName)b.B_1(); //It doesn`t work! Error in cast
    }
    ....
}

class B {
    public void B_1() {
        ...
    }
    ....
}

A a = new A();
B b = new B();
a.A1(b);

如何正确地强制转换对象?

您确定您不是有意要执行
(B)B.B_1()

C#有一个静态类型系统,即所有类型都必须在编译时已知(模反射)。因此,将类型转换为仅在运行时已知的类型是没有意义的。明确指定类型:

public void A_1(object obj)
{
    ...
    B b = (B)obj;
    b.B_1();
    // or
    ((B)obj).B_1();
}

如果要将任何类型的对象强制转换为其他类型的对象,请执行以下操作:

// Will Throw an exception at runtime if it cant be cast.
B newObject = (B)oldObject; 

// Will return null at runtime if the object cannot be cast
B newObject = oldObject as B; 

// If in a generic method, convert based on the generic type parameter regardless of condition - will throw an exception at runtime if it cant be cast
B newObject = (T)Convert.ChangeType(oldObject, typeof(T))
你的语法不正确;您不需要从全名转换为对象,只需从类型符号转换即可

double x = (double)40;

ClassB anotherInstance = (ClassB)someOtherInstance;
您也可以这样做:

class A {
    public void A_1(Object b) {
        ...
        if (b is B)
        {
             ((B)b).B_1();
        }
    }
    ....
}

你想做的基本上是:

Foo myFoo = ("Foo")myObject;
这在C#中肯定行不通。当您在C#中进行强制转换时,编译器会发出执行强制转换的代码,它需要知道从何处进行强制转换,才能编写该代码。字符串在这里对编译器没有帮助


正如其他人所指出的,你想做的事情似乎并不需要(除非这只是一个人为的例子)。如果你真的想这样做,你需要使用一种比C更具动态性的语言,或者找到一种C友好的方法来实现这一点;这不是一种类型。改为使用:
((B)B).B_1()另外,使用
GetType()
是一种动态获取对象类型的方法,但强制转换只有在编译时已知目标类型时才可能或有用(根本不是动态的)。为了强制转换,只需在一对括号中直接引用类型。不要试图获取或使用类型为
type

uhh的对象,如果总是要调用
b
实例方法,为什么必须传入
b
对象?为什么不直接将其作为
B
传递?那么就不需要强制转换。或者,如果参数不总是类型为“B”,请使用接口或泛型。因为,我不知道方法a_1(对象B)@mystdeim中对象的确切类型-如果您不知道类型,那么您如何知道它可以强制转换为B?您确定类型继承自B吗?请尝试为所有类型指定方法B_1()的公共接口,这些类型可以在方法A_1()中传递。另一个提示:您可以使用操作符is检查是否可以将一个类型强制转换(更准确地说,是继承)到另一个类型。如果(A是B){…}应该是
((B)B)对象上执行这个方法。