[英]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.