簡體   English   中英

C#泛型隱式運算符返回類型

[英]C# generic implicit operator return type

為了自動將代碼從C ++轉換為C#,我希望有一個C#類(偽代碼)

class Null {
    public static implicit operator T (Null unused) {
        return null;
    }
}

這在諸如此類的情況下非常有用

foo(T1 x) { ... }
foo(T2 x) { ... }

foo(null); // ambiguous

出於某些原因,通常不可能以編程方式消除上述類型的歧義。 例如

foo((T1)null); // Discovering T1 over T2 is not possible or really hard to do

但如果我有上面的Null類,我可以通過編程方式添加

foo(Null x) {...}

並生成

foo(new Null()); // not ambiguous

訣竅是使用new Null()代替每個生成的null ,即使是偶數

T1 x = new Null();

x == null編譯。

是否可以寫這樣的課程?

沒有dynamic關鍵字,C#中的所有方法綁定都是在編譯時完成的 - 甚至綁定到隱式轉換運算符。 這意味着您遇到的方法重載解決問題也會阻止編譯器確定是否要將null隱式強制轉換為T1或T2。 並且使用dynamic將無法工作,因為null在運行時沒有任何類型。

如果您可以共享更多信息,則可能存在其他問題的解決方案。 例如,如果兩個方法中的任何一個在傳遞空值時都能正常工作,並且您只是想嘗試生成生成的代碼,那么您可以創建一個這樣的方法:

foo(object o) {return Foo((T1)null);}

然后將調用轉換為:

foo(new object());

如果你想使用Null類而不是object ,上面的方法也可以工作 - 不需要隱式強制轉換。

另一方面,如果使用空值調用哪個重載確實很重要,那么您需要告訴我們原始程序如何確定調用哪個。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM