【问题标题】:Casting an object reference in c#在 C# 中转换对象引用
【发布时间】:2011-03-17 21:18:33
【问题描述】:

如果我有一个引用对象的函数。如何转换参数以避免类型不匹配?

Dictionary<string, string> mySettings = new Dictionary<string, string>();
.
.
saveSettings(ref mySettings);
.
.
void saveSettings(ref object)
{
}

调用 saveSettings 会导致以下错误消息:

无法从“引用字典”转换为“引用对象”

我不是在寻找解决方法,我已经做到了,我想知道这种直接方法是否可行。

【问题讨论】:

  • 为什么saveSettings() 会引用一个对象?你想达到什么目的?我敢肯定,一旦你能澄清,就会有更好的解决方案。
  • void saveSettings (ref object theObject) 将是更正

标签: c# object casting ref


【解决方案1】:

如果保存设置采用多种类型,为什么不使用泛型呢?特别是如果他们共享一个公共接口。

void saveSettings<T>(T obj);

【讨论】:

  • 谢谢,我会试试的。如果我传递 2 个参数,第一个参数是文件名(字符串),而只有第二个参数需要指定为泛型怎么办?那是什么语法?
  • void saveSettings(字符串文件名,T obj)
【解决方案2】:
var objectMySettings = mySettings as object;
if (objectMySettings != null)
    saveSettings(ref objectMySettings);

【讨论】:

  • 泛型解决方案是一个很好的建议。由于这解决了我的具体问题,因此我选择它作为首选答案。
  • 我必须说,这种方式对 mySettings 对象的引用不会传递给 objectMySettings,所以如果你在 saveSettings 方法中将 null 赋给 objectMySettings,mySettings 对象仍然有值,它不会为空因此会丢失真正的参考行为
【解决方案3】:
void saveSettings(ref object)

saveSettings 的定义格式错误。在“ref object”之后需要一个标识符。但我会将“ref 对象”改为 Dictionary。

【讨论】:

  • 将参数重新定义为特定类型会限制函数。但这是我目前的解决方法。
  • 也许你应该像另一张海报提到的那样使用泛型。
【解决方案4】:

这样做:

 protected void Button1_Click(object sender, EventArgs e)
{
    Dictionary<string, string> mySettings = new Dictionary<string, string>();

    saveSettings(mySettings);
}

void saveSettings( Dictionary<string, string> Settings)
{
}

【讨论】:

    【解决方案5】:

    类似这样的:

    static void Main()
    {
    
       Dictionary<string, string> mySettings = new Dictionary<string, string>();
       object o = mySettings;
       SaveSettings(ref o);
       // o now has an item.
    }
    
    static void SaveSettings(ref object o)
    {
        var d = o as Dictionary<string, string>;
        d.Add("Some", "String");
    }
    

    EDIT 一些调试输出。

    【讨论】:

    • 查看我对 HelloWorld 的评论。您的解决方案不会更新 mySettings,这是我需要它做的。不过谢谢。
    • 是的,迈克。将其应用于我的代码没有,我将不得不对此进行调查。感谢您的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-17
    相关资源
    最近更新 更多