[英]C#, dynamic return type
我需要的是一個方法,可以在一個條件后返回一個類型(沒有對象,導致不允許轉換)。 這是一個例子:
??? right (string fullStr, int endPosition)
{
string tmpStr = "";
tmpStr = fullStr.Substring(endPosition);
if(tmpStr.Length == 1)
return tmpStr[0]; //return a char!!
else
return tmpStr; //return a string!!
}
我嘗試了泛型,但我只能返回進入的類型,(如果返回了char中的char,並且返回了字符串中的字符串)。 我試過這個:
public static T right<T>(T stringToCheck, int endPosition)
{
if (typeof(T).ToString() == "System.String")
{
string fullString = (string)((object)stringToCheck);
string response = "";
response = fullString.Substring(endPosition);
if (response.Length == 1)
{
return (T)((object)response[0]);
}
else
return (T)((object)response);
}
return stringToCheck;
}
我不能使用類型轉換(返回一個對象),不能使用ref params。
對方法的調用必須保持不變:
right(stringOrChar,int) -> returns string or char.
謝謝
我認為這在理論上是不可能的。 您可以在C#4中使用“動態”,但如果您還沒有,那么就不能這樣做。
如果它可以返回一個字符串或一個字符,那么它必須是一個對象,它們都來自哪個“對象”是你唯一的選擇。 然后你必須做演員陣容。
C#(3.5和之前的版本)需要知道方法的單一返回類型是什么,以便它可以檢查調用方法。 事實上,在C#4中,當你說“動態”時,它實際上使用了“對象”。
您可以創建一個包含兩者的自定義類/結構
public class StringOrChar
{
char charValue;
string stringValue;
bool isString;
}
但它很笨拙。
為什么你想要不同的退貨類型?
必須鍵入函數的返回類型。 與任何其他變量或操作一樣,從指定類型繼承的任何類型都是有效的返回值(這就是object
允許任何值作為值的原因)。
來電者的后勤工作沒有多大意義; 您如何知道在示例中是否將變量鍵入為char
或string
?
是否有特殊原因導致您無法在所有情況下返回string
?
你可以out
參數。 或返回包含兩種變體的類型。
有很多“左(str,1)<'x'”但其他時候它只是abc = left(str,3)
在這種特殊情況下,您只需返回單字符字符串即可。 比較字符串按照字典順序進行操作,因此這里沒有特別需要使用字符(當然,除非原始作者使用多態來將字符與字符串區別對待,在這種情況下,您有我的同情心)。
方法只能 - 據我所知 - 返回一種類型
所以返回對象和強制轉換是合乎邏輯的選擇
但請注意,如果你的設計迫使你陷入這種困境,那么它可能存在缺陷; 或許更多細節可以幫助我們
注意:jon雙向飛碟免受所有這些限制
那這個呢:
string right(string fullStr, int endPosition, out bool oneChar)
{
string result = fullStr.Substring(endPosition);
oneChar = result.Length == 1;
return result;
}
Enriquev,
如果不改變VBA的語法,就無法實現權利 。 你可以指定你想要的返回類型,但這基本上是鑄造......
public static U right<T, U>(T input, int index)
{
...
return (U)returnVariable;
}
我真的不認為這可以解決你的問題。
是否可以對單引號括起的所有單個字符進行正則表達式替換? 這將使字符成為字符串並允許比較運算符工作。
這應該工作:
public static dynamic right(string fullStr, int endPosition)
{
string tmpStr = "";
tmpStr = fullStr.Substring(endPosition);
if (tmpStr.Length == 1)
return tmpStr[0]; //return a char!!
else
return tmpStr; //return a string!!
}
測試此代碼:
static void Main(string[] args)
{
var str = right("Hello", 3);
Console.WriteLine(str.GetType()); // System.String
var ch = right("Hello", 4);
Console.WriteLine(ch.GetType()); // System.Char
}
你想這樣做嗎?
/// <summary>
/// Emulates VB Right Function
/// Returns a string containing a specified number of characters from the right side of a string.
/// </summary>
/// <param name="s"></param>
/// <param name="length">The number of characters to return.</param>
/// <returns>
/// The right <paramref name="length"/> number of characters from the string.
/// If the string has less than or equal to <paramref name="length"/> number of characters,
/// an empty string is returned.
/// </returns>
public static string Right(this string s, int length)
{
return length > s.Length ? string.Empty : s.Substring(s.Length - length);
}
調用此方法時,您可以執行以下操作:
string myString = "Test String";
string returnedString = mystring.Right(1);
char? myChar = returnedString.Length == 1 ? returnedString[0] : null;
bool isReturnValueAChar = myChar.HasValue;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.