铸造代表
我对c#很新,所以我的问题可能很简单,但是这里有。
我一直在努力与代表合作,并且有点坚持这个问题。
..... public delegate double delegateA(); public delegate double delegateB(); public static double myFunc() { return 0; } public static delegateA myTest() { return myFunc; } static void Main(string[] args) { delegateB myFuncDelegate; myFuncDelegate = myTest(); // <-- Error: Cannot implicitly convert type.... } .....
我不知道如何使这个转换工作,除非使用相同的委托作为类型。 但是在我的项目中,代表的名称会更加漂亮(因为它们存在于不同的类中)。
希望您能够帮助我。
你不能直接在这样的代表之间进行转换。 你可以做的是从一个现有的,兼容的代表创建一个新代表。 因此,如果您将代码更改为:
delegateB myFuncDelegate = new delegateB(myTest());
那可行。 (请注意,“兼容性”并不一定意味着签名相同 – 有关详细信息,请参阅语言规范。)
只是为了让其他读者稍微清楚一点,这里有一个更简单的完整示例,它不需要任何方法调用。
// Two delegate types with the same signature delegate void Foo(); delegate void Bar(); class Test { static void Main() { // Actual value is irrelevant here Foo foo = null; // Error: can't convert like this // Bar bar = foo; // This works fine Bar bar = new Bar(foo); } }
请注意,此“无转换”规则有一个例外 – C#4中的generics差异。例如,在C#4中,您可以编写:
Action
…因为Action
在T
是逆变的(因此它实际上被声明为Action
)。 这是一个引用转换 – 它不会像第一个示例那样创建新的委托。 但是,这不仅仅适用于“兼容”代表 – 只有通用代理。
此外,不完全是你问的问题,但有趣的是 – 这不起作用:
Func func_double = () => 1; Func
但这样做:
Func func_string = () => "hello"; Func
作为字符串示例的差异是使用可以强制转换为对象的引用类型,而必须将double加密,从而阻止直接强制转换
上述就是C#学习教程:铸造代表分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/998471.html