C# 如何使用变量委托实现参数到参数的隐式转换?

C# 如何使用变量委托实现参数到参数的隐式转换?,c#,delegates,C#,Delegates,我希望隐式地将参数转换为参数,而不是使用类型转换显式地转换参数。参数的派生比参数少,因此使用逆变委托,我希望参数隐式转换为参数。然而,编译器仍然抱怨我需要显式地将“object”转换为“string” publicstaticvoidmain() { doSomething=doSomething; object obj=“text”; 剂量测定法(obj); } 公共代表(str); 公共静态void DoSomething(字符串str) { } 您不能调用需要包含对象的字符串的方法,或者更

我希望隐式地将参数转换为参数,而不是使用类型转换显式地转换参数。参数的派生比参数少,因此使用逆变委托,我希望参数隐式转换为参数。然而,编译器仍然抱怨我需要显式地将“object”转换为“string”

publicstaticvoidmain()
{
doSomething=doSomething;
object obj=“text”;
剂量测定法(obj);
}
公共代表(str);
公共静态void DoSomething(字符串str)
{
}

您不能调用需要包含对象的字符串的方法,或者更一般地说,您不能使用基实例代替派生实例

执行此操作时:

DDoSomething<string> doSomething = DoSomething;

@常规
字符串
派生自
对象
=)
DoSomething
需要将
字符串
的一个实例传递到中,您不能更改此事实。这就是类型安全的要点,当您试图传递无效的内容时,编译器将警告您(有错误)。另外,您能给我们提供更多的上下文吗?为什么您要这样做?@GuruStron我刚刚更正了它=),我没有键入我所想的内容。@GuruStron原因是有时候,我发现自己将一个实际上是字符串的对象作为参数传递给一个相应参数为字符串的函数。这很琐碎,但我一直在寻找一个替代演员的选择。啊,我明白了。因此,要实现我所寻找的隐式转换类型,您必须使用反向赋值兼容性,因为方法参数本身不是变量(由于类型安全),只有委托是变量(即中的
使委托泛型类型参数变为变量,而不是方法参数)。是吗?@MyWrathAcademia是的,没错。如果您可以控制类型,则可以定义类型以避免强制转换。使用
object
string
时,您必须强制转换,或者执行
ToString()
DDoSomething<string> doSomething = DoSomething;
public static void Main()
{
    DDoSomething<object> doSomething = (object obj) => Console.WriteLine(obj);
    
    DDoSomething<string> doSomethinString = doSomething;
    // Using a DDoSomething<object> in place of DDoSomething<string> is legal because of "in"

    doSomethinString("text");
    // This is safe because string is used in place of object (derived in place of base)
}

public delegate void DDoSomething<in A>(A str);