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