從C#引述CLR對於所有的.NET運算符,重載方法必須是公共的和靜態的嗎?
的CLR規範要求操作者過載的方法是 公共和靜態方法。
我檢查了ECMA-335,但找不到任何證據。
到目前爲止,我知道它對於C#和F#是正確的。所有符合CLS的語言都適用嗎?
從C#引述CLR對於所有的.NET運算符,重載方法必須是公共的和靜態的嗎?
的CLR規範要求操作者過載的方法是 公共和靜態方法。
我檢查了ECMA-335,但找不到任何證據。
到目前爲止,我知道它對於C#和F#是正確的。所有符合CLS的語言都適用嗎?
它看起來好像不是確實需要公開,但使它非靜態在執行時是有問題的。我嘗試用這個代碼開始:
using System;
class Oddity
{
public static Oddity operator+(Oddity x, Oddity y)
{
Console.WriteLine("Adding oddities");
return null;
}
}
class Test
{
static void Main()
{
var x = new Oddity();
var y = new Oddity();
var z = x + y;
}
}
...然後運行它通過ildasm
,改變的東西,然後使用ilasm
和運行結果。
assembly
(相當於internal
):一切正常改變無障礙修飾符private
:它組裝(這讓我吃驚),但是在執行時失敗:
未處理的異常:System.MethodAccessException:通過方法'Test.Main()'嘗試訪問方法'Oddity.op_Addition(Oddity,Oddity)'失敗。
在Test.Main()
卸下static
部分:它組裝(同樣,令人驚訝的我),但此後未能在執行時:
未處理的異常:system.missingMethodException而:方法不發現:'奇怪Oddity.op_Addition(奇怪,奇怪)'。
在Test.Main()
我懷疑這真的應該來在編譯時抓住了,但因爲語言只預計生產商,其是公開的,靜態的,驗證是有點鬆懈。
它在ECMA-335肯定提到,章I.10.3.1和3.2:'他們 表示爲在class' –
@HansPassant THX靜態方法,發現! – colinfang