铸造代表

我对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 foo = x => Console.WriteLine(x.GetHashCode()); Action bar = foo; 

…因为ActionT逆变的(因此它实际上被声明为Action )。 这是一个引用转换 – 它不会像第一个示例那样创建新的委托。 但是,这不仅仅适用于“兼容”代表 – 只有通用代理。

此外,不完全是你问的问题,但有趣的是 – 这不起作用:

 Func func_double = () => 1; Func func_object; func_object = func_double; 

但这样做:

 Func func_string = () => "hello"; Func func_object; func_object = func_string; 

作为字符串示例的差异是使用可以强制转换为对象的引用类型,而必须将double加密,从而阻止直接强制转换