相关疑难解决方法(0)

C#属性和ref参数,为什么没糖?

我刚刚在C#中工作时遇到此错误消息

属性或索引器不能作为out或ref参数传递

我知道造成这种情况的原因并快速解决了创建正确类型的局部变量的问题,使用它作为out/ ref参数调用函数,然后将其分配回属性:

RefFn(ref obj.prop);
Run Code Online (Sandbox Code Playgroud)

变成

{
    var t = obj.prop;
    RefFn(ref t);
    obj.prop = t;
}
Run Code Online (Sandbox Code Playgroud)

显然,如果属性不支持在当前上下文中获取和设置,则会失败.

为什么C#不能为我这样做?


我能想到这可能导致问题的唯一情况是:

  • 穿线
  • 例外

对于线程转换影响写入发生时(在函数调用之后与函数调用之间),但我宁愿怀疑任何依赖的代码在它中断时会得到很少的同情.

对于例外,关注的是; 如果函数分配给几个ref参数之一而不是抛出会发生什么?任何一个简单的解决方案都会导致所有参数都被分配给某些参数,而某些参数不应该分配给某些参数.我再次认为这不会支持使用该语言.


注意:我理解为什么会生成此错误消息的机制.我正在寻找的是为什么C#不会自动实现简单的解决方法.

c# properties syntactic-sugar reference-parameters

70
推荐指数
6
解决办法
4万
查看次数

将属性作为参数传递给方法

我知道标题可能更具描述性/更好的措辞,但这是我能想到的最好的.

目前我的课程有很多方法,如下所示:

        private static void UpdateArtists()
        {
            artists.Clear();
            foreach (AudioInfo entry in library_entries)
            {
                artists.Add(entry.Artist, entry);
            }
        }

        private static void UpdateAlbums()
        {
            albums.Clear();
            foreach (AudioInfo entry in library_entries)
            {
                albums.Add(entry.Album, entry);
            }
        }

        private static void UpdateGenres()
        {
            genres.Clear();
            foreach (AudioInfo entry in library_entries)
            {
                genres.Add(entry.Genre, entry);
            }
        }

        private static void UpdateYears()
        {
            years.Clear();
            foreach (AudioInfo entry in library_entries)
            {
                years.Add(entry.Year, entry);
            }
        }
Run Code Online (Sandbox Code Playgroud)

毋庸置疑,编写其中的数十篇非常令人厌烦.所以我想知道是否可以简化它并制作一个类似这样的方法:

     private static void Update(Dictionary<string, AudioInfo> dictionary, AudioInfo.Property property)
     {
         dictionary.Clear();
         foreach (AudioInfo entry …
Run Code Online (Sandbox Code Playgroud)

c#

5
推荐指数
1
解决办法
5748
查看次数